Pregunta

Teniendo en cuenta que usted está tratando exclusivamente para optimizar la velocidad, lo que son buenas heurísticas para decidir si una función inline o no? Obviamente el tamaño del código debe ser importante, pero hay otros factores que se utilizan típicamente cuando (por ejemplo) o gcc CPI es determinar si a una llamada de función inline? ¿Ha habido algún trabajo académico significativo en el área?

¿Fue útil?

Solución

algunos párrafos sobre esto, con algunos enlaces en la parte inferior:

  • Además de los problemas de tamaño de la memoria caché y, otra consideración es registrar la presión . Desde el punto de vista del compilador "las variables añadidas desde el procedimiento inline puede consumir registros adicionales, y en una zona donde la presión de registro ya es alta puede forzar a derramarse, lo que provoca accesos memoria RAM adicional."

Idiomas con compiladores JIT y la carga de clases de tiempo de ejecución tienen otras ventajas y desventajas ya que los métodos virtuales no se conocen de forma estática, sin embargo, el JIT puede obtener el tiempo de ejecución de perfiles de información, tales como la frecuencia llamada de método:

  • diseño, implementación y evaluación de las optimizaciones en una Just-in -Tiempo Compiler (para Java) habla de método procesos en línea de métodos estáticos y dinámicamente clases cargadas y sus mejoras en el rendimiento.

  • la práctica del judo: Java bajo dinámicos optimizaciones afirma que su "política de inclusión entre líneas se basa en el tamaño del código y la información de perfil. Si la frecuencia de ejecución de un método de entrada está por debajo de un cierto umbral, el método es entonces no inlined porque es considerado como un método en frío. Para código de evitar la explosión, no en línea "un método con un tamaño de código de bytes de más de 25 bytes.... Para evitar inlining lo largo de una cadena de llamadas profundo, inlining se detiene cuando el tamaño de código de bytes inline acumulado a lo largo de la cadena de llamada supera los 40 bytes. A pesar de que el tiempo de ejecución se han perfilado información (frecuencia llamada de método) siguen siendo cuidadoso para evitar inlining grandes funciones o cadenas de funciones para evitar la hinchazón.

una búsqueda en Google Académico revela una serie de documentos, tales como

una búsqueda en Google Libros revela un buen número de libros con papeles o capítulos sobre la función inline en diversos contextos.

Otros consejos

Una llamada a la función implica un cierto código adicional (la función de prólogo, donde el nuevo marco de pila está configurado, y el epílogo de función, donde es limpiado). Si el compilador ve que el código de función es pequeña en comparación con el prólogo y el epílogo, se puede decidir que no vale la pena hacer una llamada real, y tendrá la función inline.

El único beneficio que veo de llamar a una función en lugar de inlining que están relacionadas con el tamaño. Supongo inlining una función luego desenrollar un bucle puede resultar en un aumento significativo de tamaño.

por lo que yo tengo de la sierra, el tamaño de la función es el único factor de compiladores utilizados para determinar en línea. Sin embargo si lo hace la optimización del perfil guiada (PGO), creo compilador es capaz de utilizar otras variables, como el número de llamadas / llamada en tiempo de instalación.

En .NET es se basa principalmente en el tamaño. Medir el tamaño de la función madre y el niño a funcionar en bytes compilados. A continuación, medir el tamaño de la función combinada. Si la función combinada es menor, entonces inlining es una idea buena.

La razón de esto es para que sea posible meter la mayor cantidad de código en la memoria caché de la CPU como sea posible. fallos de caché son mucho más caras que las llamadas a funciones en las CPU moderna.

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