Ver Mensaje Individual
  #6  
Antiguo 07-02-2014
Avatar de Al González
[Al González] Al González is offline
In .pas since 1991
 
Registrado: may 2003
Posts: 5.604
Reputación: 29
Al González Es un diamante en brutoAl González Es un diamante en brutoAl González Es un diamante en brutoAl González Es un diamante en bruto
Cita:
Empezado por ecfisa Ver Mensaje
Lamento mucho no disponer de esas versiones para realizar la prueba. Pero sé que un colega amigo está usando la versión XE, hoy voy a intentar contactarlo [...]
Gracias Daniel. Tú siempre poniendo el ejemplo a los que poseen la inmensa fortuna de poder acceder a muchas versiones de Delphi.

Cita:
Empezado por ecfisa Ver Mensaje
Con mi viejo y querido Delphi 7 me arreglo con la función IsEqualGuid
Sí, sobre esa función comentábamos algo el otro día:
Cita:
Empezado por Al González Ver Mensaje
Ahora pasemos a las funciones átomo, también agregadas a GHFRTL.pas:
Código Delphi [-]
  { Equals? }
  Function ghEquals (Const Value1, Value2 :TGUID) :Boolean; Overload;
  Var
    GUID1 :Array [0..3] Of Integer Absolute Value1;
    GUID2 :Array [0..3] Of Integer Absolute Value2;
  Begin
    Result := (GUID1 [0] = GUID2 [0]) And (GUID1 [1] = GUID2 [1]) And
      (GUID1 [2] = GUID2 [2]) And (GUID1 [3] = GUID2 [3]);
  End;
En Delphi 7 todavía no era posible comparar dos valores TGUID usando el operador "=", y por muchos años la recomendación fue usar la función IsEqualGUID importada de OLE32.dll. Pero me surgió la pregunta: ¿qué tan eficiente será hacer una simple comparación de 16 bytes con IsEqualGUID? Por otra parte, encontré que las versiones recientes de Delphi sí admiten la comparación de TGUIDs con el operador "=". Cuando eso ocurre, el compilador inserta una llamada al método interno TGUID.Equal:
Código Delphi [-]
class operator TGUID.Equal(const Left, Right: TGUID): Boolean;
var
  a, b: PIntegerArray;
begin
  a := PIntegerArray(@Left);
  b := PIntegerArray(@Right);
  Result := (a^[0] = b^[0]) and (a^[1] = b^[1]) and (a^[2] = b^[2]) and (a^[3] = b^[3]);
end;
El cual es de cuatro a cinco veces más rápido que IsEqualGUID. Así que buscando algo similar para Delphi 7 creé esa función ghEquals, y para mi sorpresa resultó ligeramente más eficiente que el método TGUID.Equal (en Delphi 7 genera un poco menos de código máquina y en XE2 conviene añadirle la directiva InLine).
Verificar desde cuándo puede compilarse un "If GUID1 = GUID2 Then" no tiene otro propósito que ampliar la documentación que hay al respecto. Resulta gratificante publicar o ayudar a publicar respuestas a preguntas sobre Delphi que probablemente otras personas se hacen también. A veces son "pequeñeces", como en este caso, pero ¿qué información relevante no se compone de ellas?

No hay prisa ecfisa; cuando tu amigo pueda.
Responder Con Cita