Foros Club Delphi

Foros Club Delphi (https://www.clubdelphi.com/foros/index.php)
-   Varios (https://www.clubdelphi.com/foros/forumdisplay.php?f=11)
-   -   ¿Que es más rápido AnsiUppercase o Uppercase? (https://www.clubdelphi.com/foros/showthread.php?t=48809)

xander 04-10-2007 16:14:36

¿Que es más rápido AnsiUppercase o Uppercase?
 
Le pase uno de esos optimizadores de código que hay por ahí a un proyecto que tengo y me sorprendio ver que me sugería que cambiara mis llamadas a Uppercase por llamadas a AnsiUppercase y lo mismo para los equivalentes en lowercase, porque según es más rápido... ustedes creen que si tenga una ventaja hacer ese cambio??

defcon1_es 04-10-2007 16:36:19

Cita:

Empezado por xander (Mensaje 236161)
me sugería que cambiara mis llamadas a Uppercase por llamadas a AnsiUppercase y lo mismo para los equivalentes en lowercase, porque según es más rápido...

según la vcl:
Código Delphi [-]
function AnsiUpperCase(const S: string): string;
{$IFDEF MSWINDOWS}
var
  Len: Integer;
begin
  Len := Length(S);
  SetString(Result, PChar(S), Len);
  if Len > 0 then 
    CharUpperBuff(Pointer(Result), Len);
// CharUpperBuff es una funcion definida en user32.dll (de windows)
end;
{$ENDIF}
{$IFDEF LINUX}
begin
  Result := WideUpperCase(S);
end;
{$ENDIF}

Y la otra, tiene más líneas de código... por decir algo.
Código Delphi [-]
function UpperCase(const S: string): string;
var
  Ch: Char;
  L: Integer;
  Source, Dest: PChar;
begin
  L := Length(S);
  SetLength(Result, L);
  Source := Pointer(S);
  Dest := Pointer(Result);
  while L <> 0 do
  begin
    Ch := Source^;
    if (Ch >= 'a') and (Ch <= 'z') then Dec(Ch, 32);
    Dest^ := Ch;
    Inc(Source);
    Inc(Dest);
    Dec(L);
  end;
end;

xander 04-10-2007 16:44:06

La razón por la que pongo esto aqui es porque yo he hecho pruebas con Delphi 2007 y la llamada a Uppercase la resuelve más rápido que a AnsiUppercase, pero esas son mis ideas, ya algun entendido con más pericia nos develará el misterio

seoane 04-10-2007 16:44:34

Vamos por partes, uppercase utiliza un procedimiento interno para realizar la tarea. Simplemente recorre la cadena y va convirtiendo cada letra en mayúsculas aplicando una simple operación (restándole $20). Sin embargo AnsiUppercase, utiliza una función de la API para realizar la tarea. No se si la API sera mas rápido que el código de borland (lo dudo), pero tiene otras ventajas.

Por ejemplo:
Código Delphi [-]
ShowMessage(Uppercase('ñuño')); // Esto muestra ñUñO
ShowMessage(AnsiUppercase('ñuño')); // Esto muestra ÑUÑO
ShowMessage(Uppercase('nunño',loUserLocale)); // Esto muestra ÑUÑO

En el ejemplo anterior, mientras el primer Uppercase utiliza una simple operación para calcular las mayúsculas, los otros dos utilizan la función CharUpperBuf de la API. Así mientras en el primer caso el resultado no es correcto, ya que no reconoce "ñ" como una letra minúscula, en los otros dos se utiliza la configuración de idioma de windows para hacer la conversión.

En resumen, que supongo que te recomienda usar AnsiUppercase no porque sea mas rápida, sino porque no comete errores como el de la "ñ"

xander 04-10-2007 16:55:04

Muchas gracias Seoane, con esas ventajas creo que no me importará que una se lleve unos cuantos ciclos del procesador de mas... usaré AnsiUpperCase :D

Thanx

jhonny 04-10-2007 16:58:55

Pero AnsiUpperCase tiene un llamado a una API de windows CharUpperBuff, no se cuantas lineas de codigo tenga esa función pero se supone que esa función acepta caracteres UNICODE, mientras que UpperCase solo acepta caracteres ACII, por lo que asumo que debe demorar mas usar AnsiUpperCase, pero realmente hoy en dia no creo que esa diferencia de quiza milimilimili segundos sea un problema, incluso he tratado de hacer una prueba usando el GetTickCount y no he podido mostrar una diferencia, por lo que personalmente usaria AnsiUpperCase.

Nota: Veo que mientras hacia las pruebas mencionadas seoane a resuelto el caso :).

xEsk 05-10-2007 02:17:35

Bien, una duda resuelta... es una de aquellas cosas que siempre pensé: "Que diferencia "real" habrá?" pero que nunca me he detenido en buscarlo... xD

Saludos.


La franja horaria es GMT +2. Ahora son las 21:23:42.

Powered by vBulletin® Version 3.6.8
Copyright ©2000 - 2026, Jelsoft Enterprises Ltd.
Traducción al castellano por el equipo de moderadores del Club Delphi