performance - significado - que significa co en una empresa
¿Hay una diferencia de rendimiento entre inc(i) e i:=i+1 en Delphi? (6)
Tengo un procedimiento con mucha
i := i +1;
en él y creo
inc(i);
se ve mucho mejor. ¿Hay una diferencia de rendimiento o la llamada de función acaba de ser introducida por el compilador? Sé que esto probablemente no importa para mi aplicación, solo tengo curiosidad.
EDITAR: Hice algunos cálculos del rendimiento y encontré que la diferencia es muy pequeña, de hecho tan pequeña como 5.1222741794670901427682121946224e-8! Entonces realmente no importa. Y las opciones de optimización realmente no cambiaron mucho el resultado. Gracias por todos los consejos y sugerencias!
"En algunas plataformas, Inc puede generar código optimizado, especialmente útil en bucles ajustados". Para un compilador optimizado como Delphi no le importa. Eso es sobre compiladores antiguos (por ejemplo, Turbo Pascal)
Existe una gran diferencia si la verificación de desbordamiento está activada. Básicamente, Inc no realiza la verificación de desbordamiento . Haga lo que se sugirió y utilice la ventana de desensamblaje para ver la diferencia cuando tenga activadas esas opciones de compilación (es diferente para cada una).
Si esas opciones están desactivadas, entonces no hay diferencia. Regla de oro, utilice Inc cuando no le importe una falla de comprobación de rango (¡ya que no obtendrá una excepción!).
Los compiladores modernos optimizan el código.
inc (i) ei: = i + 1; son más o menos lo mismo.
Use lo que prefiera.
Editar: como corrigió Jim McKeeth: con la verificación de desbordamiento hay una diferencia. Inc no hace una comprobación de rango.
Puede verificarlo en la ventana de la CPU mientras se depura. Las instrucciones generadas de la CPU son las mismas para ambos casos.
Estoy de acuerdo Inc(I);
se ve mejor, aunque esto puede ser subjetivo.
Corrección: Acabo de encontrar esto en la documentación de Inc:
"En algunas plataformas, Inc puede generar código optimizado, especialmente útil en bucles ajustados".
Por lo tanto, probablemente sea aconsejable ceñirse a Inc.
Siempre puede escribir las dos piezas de código (en procedimientos separados), poner un punto de interrupción en el código y comparar el ensamblador en la ventana de la CPU.
En general, usaría inc (i) siempre que se use como un bucle / índice de algún tipo, y + 1 donde el 1 haga que el código sea más fácil de mantener (es decir, podría concebirse el cambio a otro entero en el futuro) o simplemente más legible desde un punto de vista de algoritmo / especificación.
Todo depende del tipo de "i". En Delphi, uno normalmente declara variables de bucle como "i: Integer", pero bien podría ser "i: PChar", que se resuelve en PAnsiChar en todo lo que está debajo de Delphi 2009 y FPC (supongo que aquí), y en PWideChar en Delphi 2009 y Delphi.NET (también adivinando).
Como Delphi 2009 puede hacer puntero-matemática, Inc (i) también se puede hacer en punteros tipeados (si están definidos con POINTER_MATH activado).
Por ejemplo:
type
PSomeRecord = ^RSomeRecord;
RSomeRecord = record
Value1: Integer;
Value2: Double;
end;
var
i: PSomeRecord;
procedure Test;
begin
Inc(i); // This line increases i with SizeOf(RSomeRecord) bytes, thanks to POINTER_MATH !
end;
Como ya dijeron los otros usuarios: es relativamente fácil ver lo que el compilador hizo de su código al abrir:
Vistas> Depurar Windows> CPU Windows> Desmontaje
Tenga en cuenta que las opciones del compilador como OPTIMIZATION, OVERFLOW_CHECKS y RANGE_CHECKS pueden influir en el resultado final, por lo que debe tener cuidado de tener la configuración de acuerdo con sus preferencias.
Un consejo sobre esto: en cada unidad, $ INCLUYE un archivo que dirige las opciones del compilador, de esta manera, no perderá configuraciones cuando su .bdsproj o .dproj esté dañado de alguna manera. (Mira el código fuente del JCL para ver un buen ejemplo sobre esto)