Pregunta ¿Por qué es difícil vencer al compilador AOT con un compilador JIT (en términos de rendimiento de la aplicación)?


Estaba pensando que los compiladores de JIT superarán eventualmente a los compiladores de AOT en términos del rendimiento del código compilado, debido a la ventaja inherente de JIT (puede usar información disponible solo en tiempo de ejecución). Un argumento es que los compiladores de AOT pueden dedicar más tiempo a compilar el código, pero una máquina virtual de servidor también podría pasar mucho tiempo.

Entiendo que JIT parezca vencer a los compiladores de AOT en algunos casos, pero parece que aún se quedan atrás en la mayoría de los casos.

Entonces mi pregunta es, ¿cuáles son los problemas específicos y difíciles que impiden que los compiladores de JIT superen a los compiladores de AOT?

EDITAR:
Algunos argumentos comunes:

  • Los compiladores AOT pueden pasar más tiempo haciendo optimizaciones avanzadas -> Si está ejecutando una VM del servidor por días, puede pasar la misma cantidad de tiempo, si no más.
  • La interpretación del código de bytes tiene un costo -> La mayoría de los compiladores JIT almacenan en caché las instrucciones nativas de la máquina de todos modos en estos días.

Otra edición más:
Para un ejemplo específico, mira este artículo: Mejorando el rendimiento de Swing: Compilación JIT vs AOT. Según lo que puedo deducir de este artículo, los autores básicamente dicen que cuando no hay puntos de conexión, la ventaja de tener información de tiempo de ejecución disminuye y, por lo tanto, AOT sin la sobrecarga de JIT, gana. Pero en un 40%? Eso no parece tener mucho sentido. ¿Es simplemente que el compilador JIT que se comparó no se ajustó para esta situación? ¿O es algo más fundamental?


32
2017-09-29 00:28


origen


Respuestas:


Hay una intercambio definitivo entre compilación de JIT y AOT (anticipación).

Como dijiste, JIT tiene acceso a información en tiempo de ejecución que puede ayudar en la optimización. Esto incluye datos sobre la máquina en la que se está ejecutando, lo que permite la optimización nativa específica de la plataforma. Sin embargo, JIT también tiene la sobrecarga de traducir el código de bytes a instrucciones nativas.

Esta sobrecarga a menudo se vuelve aparente en aplicaciones donde se necesitan respuestas de inicio rápido o casi en tiempo real. JIT tampoco es tan efectivo si la máquina no tiene recursos suficientes para la optimización avanzada, o si la naturaleza del código es tal que no puede ser "agresivamente optimizado".

Por ejemplo, tomado de el artículo que vinculó:

... qué deberíamos   mejorar en la ausencia de cuellos de botella de rendimiento claro? Como puedes   he adivinado, el mismo problema existe para el JIT guiado por perfil   compiladores. En lugar de unos pocos puntos calientes para ser optimizados agresivamente,   hay muchos "puntos calientes" que se dejan intactos.

Los compiladores de AOT también pueden pasar tanto tiempo optimizando como quieran, mientras que la compilación de JIT está sujeta a los requisitos de tiempo (para mantener la capacidad de respuesta) y los recursos de la máquina cliente. Por este motivo, los compiladores de AOT pueden realizar una optimización compleja que sería demasiado costosa durante el JIT.

También vea esta pregunta SO: Compilador JIT contra compiladores fuera de línea


26
2017-09-29 01:16