2009-11-28 13 views
5

¿Qué sucede con las funciones o procedimientos en Delphi (específicamente v2010 aquí, pero tuve el mismo problema con Turbo Delphi)?Delphi 2010 inline inútil?

Existe cierta discalimer en la ayuda al respecto no siempre puede inline una función debido a "ciertos criterios" sea lo que sea.

Pero he encontrado que, en general inlining funciones (incluso los muy simples que tienen 3 o 4 líneas de código) se ralentiza código en lugar de lo acelera.

Una gran idea sería una opción de compilación para "alinear todo". No me importa si mi exe crece en un 50% más o menos para que funcione más rápido.

¿Hay alguna manera de forzar a Delphi código realmente en línea, incluso si no se decide a ser inlinded por el compilador? Eso realmente ayudaría. De lo contrario, debe hacer una "inserción manual" de la replicación del código de procedimiento en varias áreas de su código con comentarios como "// error en la línea aquí, así que si cambia las 5 líneas siguientes, cámbielas en los otros 8 lugares duplicados este código existe "

¿Algún consejo aquí?

Respuesta

11

Hay una opción de compilación para el encuadre automático de rutinas cortas. En Opciones de proyecto, en Compilador de Delphi -> Compilación -> Generación de código, cambie "Control de alineación de código" a Automático. Tenga en cuenta, sin embargo, que esto solo debe estar en una compilación de lanzamiento, ya que el código en línea es difícil de depurar.

También, usted ha dicho que no le importa hacer su programa más amplio, siempre y cuando se hace más rápido, pero que inlining menudo hace que sea más lenta. Debe tener en cuenta que eso podría estar relacionado. Cuanto mayor sea el código compilado, más errores de caché de instrucciones tendrá, lo que ralentiza la ejecución.

Si realmente desea acelerar su programa, ejecútelo a través de un generador de perfiles. Recomiendo Sampling Profiler, que es gratis, está hecho para trabajar con el código Delphi (incluido 2010) y no ralentiza su ejecución. Le mostrará un informe detallado de qué código está gastando más tiempo ejecutando. Una vez que haya encontrado eso, puede concentrarse en los cuellos de botella e intentar optimizarlos.

+1

El código de ajuste de control establecido en automático no ayudó. Sampling Profiler es excelente. Muy útil para mostrar dónde están los cuellos de botella en las estadísticas reales. Incluso si realmente me mostró lo que ya soy nuevo. Te será útil en el futuro seguro. Gracias. – TallGuy

3

La alineación puede hacer las cosas más lentas en algunos casos. La función en línea puede aumentar la cantidad de registros de CPU requeridos para las variables locales. Si no hay suficientes registros disponibles, las variables se ubicarán en la memoria, lo que lo hace más lento.

Si la función no está en línea, tendrá (casi) todos los registros de la CPU disponibles.

he encontrado que es que no es normalmente una buena idea inline funciones que contienen bucles. Usarán un par de variables que probablemente terminen en la memoria, haciendo que el código en línea sea más lento.

+2

Aumentar la cantidad de bytes necesarios para ejecutar un determinado algoritmo también consumirá más el caché de la CPU. En casos raros, esto también podría tener un efecto. –

+3

Lars +1 - excepto que no es tan raro. –

1

Si desea fuerza inlining a continuación, utilizar incluir archivos. Debes asegurarte de declarar las variables correctas y luego usar {$ I filename.inc}. Eso siempre inyectará ese código específico justo donde lo desee y lo mantendrá más fácil si necesita cambiarlo.

Ten en cuenta que el compilador está escrito por personas mucho más inteligentes que la mayoría de los simples mortales (incluyéndome a mí) y tiene acceso a más información al decidir en línea o no, así que cuando no está en línea probablemente tenga una buena razón .

0

Si entendí correctamente uno de los desarrollos del compilador FPC (que tiene el mismo problema) correctamente, la alineación solo puede ocurrir cuando la rutina para estar en línea ya se compiló.

IOW si hace que la unidad con las funciones inline-to-be sea una unidad "hoja", y lo pone como el primero en la cláusula uses de su proyecto (.dpr), debería estar bien. Tenga en cuenta que con unidad "hoja", me refiero a una unidad que no depende de otras unidades en el proyecto, solo en unidades ya compiladas.

No me sorprendería que fuera igual en Delphi, ya que comparte un sistema de unidades basado en los mismos principios.

También es bastante inviable sin violar los principios de compilación por separado.