performance compiler-construction jit vm-implementation

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



compiler-construction vm-implementation (1)

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 de AOT pueden dedicar más tiempo a realizar optimizaciones avanzadas. - Si está ejecutando una máquina virtual de servidor por días, puede emplear la misma cantidad de tiempo, si no más tiempo.
  • La interpretación del código Byte ha costado -> 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 ver un ejemplo específico, consulte este artículo: Mejora del rendimiento de Swing: JIT vs AOT Compilation . 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?


Existe un intercambio definitivo entre JIT y compilación AOT (anticipada).

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 se puede "optimizar de manera agresiva".

Por ejemplo, tomado del artículo que vinculó :

... ¿qué deberíamos mejorar a falta de cuellos de botella de rendimiento claros? Como habrás adivinado, existe el mismo problema para los compiladores JIT guiados por perfiles. 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 ASÍ: compilador JIT contra compiladores fuera de línea