Pregunta

¿Cuál es el camino con las funciones o procedimientos de línea en Delphi (específicamente v2010 aquí, pero tuve el mismo problema con Turbo Delphi)?

Hay algún discalimer en la ayuda acerca de que no siempre puede incluir una función en línea debido a "ciertos criterios". lo que sea que eso signifique.

Pero he descubierto que, en general, las funciones en línea (incluso las muy simples que tienen 3 o 4 líneas de código) ralentizan el código en lugar de acelerarlo.

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

¿Hay alguna forma en que pueda forzar a Delphi a realmente incluir el código en línea, incluso si el compilador no ha decidido incluirlo? Eso realmente ayudaría. De lo contrario, debe hacer "inlining manual" de replicar el código de procedimiento en varias áreas de su código con comentarios como " // error en la alineación aquí, por lo que si cambia las siguientes 5 líneas, cámbielas en los otros 8 puntos duplicados en que existe este código "

¿Algún consejo aquí?

¿Fue útil?

Solución

Hay una opción de compilador para la inserción automática de rutinas cortas. En Opciones de proyecto, en Delphi Compiler - > Compilación - > Generación de código, gire " Control de alineación de código " a Auto. Sin embargo, tenga en cuenta que esto solo debe estar en una versión de lanzamiento, ya que el código en línea es difícil de depurar.

Además, dijiste que no te importa hacer que tu programa sea más grande siempre que sea más rápido, pero que a menudo la alineación lo hace más lento. Debe tener en cuenta que eso podría estar relacionado. Cuanto más grande sea su código compilado, más errores de caché de instrucciones tendrá, lo que ralentizará la ejecución.

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

Otros consejos

La alineación puede hacer las cosas más lentas en algunos casos. La función en línea puede aumentar el número de registros de CPU necesarios para las variables locales. Si no hay suficientes registros, las variables disponibles 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 CPU disponibles.

He descubierto que, por lo general, no es una buena idea incorporar funciones que contengan bucles. Utilizarán un par de variables que probablemente terminen en la memoria, haciendo que el código en línea sea más lento.

Si desea forzar la inserción , use los archivos de inclusión. Debe asegurarse de declarar las variables correctas y luego usar {$ I filename.inc }. Eso siempre inyectará ese código específico justo donde lo desee, y facilitará su mantenimiento si necesita cambiarlo.

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

Si entendí uno de los desarrollos del compilador de FPC (que tiene el mismo problema) correctamente, la alineación solo puede ocurrir cuando la rutina que se debe incluir ya está compilada.

IOW si hace que la unidad con las funciones en línea sea una '' hoja '' unidad, y colóquelo como el primero en la cláusula de usos de su proyecto (.dpr), debería estar bien. Tenga en cuenta que con " leaf " unidad, me refiero a una unidad que no depende de otras unidades en el proyecto, solo ahora 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 inamovible sin violar los principios de compilación por separado.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top