¿Cuáles son buenas para la heurística inlining funciones?
-
22-09-2019 - |
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?
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
- El efecto de la expansión del código de optimizaciones en el diseño caché de instrucciones
- Función Inlining al código de calibre Restricciones para Embedded Procesadores
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.
-
El compilador: manual de diseño y optimizaciones de generación de código de máquina tiene un capítulo sobre Técnicas Statisical y la máquina de aprendizaje en el compilador de diseño, con la heurística para ajustar diferentes parámetros, perfiles de los resultados. Este capítulo referencias del papel Vaswani et al Microarchitecture Modelos empíricos sensibles para optimizaciones del compilador donde se proponen "el uso de modelos empíricos técnicas para la construcción de modelos sensibles microarquitectura de las optimizaciones del compilador".
-
(Algunos otros libros hablan de inling desde el punto de vista del programador, como C ++ para programadores de juegos , which habla sobre los peligros de las funciones inline con demasiada frecuencia y las diferencias entre inline y macros. Los compiladores suelen ignorar las peticiones en línea del programador si se puede determinar que iban a hacer más daño que bien; Esto se puede anular con macros como un último recurso.)
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.