puedo dar un ejemplo de una optimización. Supongamos que tiene una función en alguna parte. (Piense en esto como un pseudocódigo tipo C.)
void function(MyClass x)
{
x.doSomething();
for (obj in x.getWidgets())
obj.doSomethingElse();
}
Esto es bastante vago. Supongamos, sin embargo, que solo tiene una clase concreta en toda su imagen que hereda de MyClass
: MyConcreteClass
. En ese caso, el JIT puede en línea doSomething
y getWidgets
. Si sabe sobre el tipo devuelto desde getWidgets
, entonces tal vez puede alinear doSomethingElse
también.
Suponiendo que MyClass
no es una clase final/sellada, un compilador adelantado no puede alinear su método (no sabría qué funciones alinear); para todo lo que sabe el compilador, hay cientos de implementaciones diferentes de MyClass
.
Sin embargo, un JIT se puede optimizar para el estado actual de la imagen . Puede instalar un cheque al comienzo de cada llamada al function
que se asegura de que x
es un MyConcreteClass
, y luego ejecuta la versión impresa. Si dinámicamente carga un módulo con otra clase concreta que hereda de MyClass
, la verificación fallará y el JIT recompilará la función para que sea genérica.
Estos son los únicos tipos de optimizaciones disponibles para los compiladores JIT que no están disponibles a por delante de los tiempos compiladores: optimizaciones que hacen uso de la información sobre el estado dinámico del programa y volver a compilar el programa en consecuencia.
Tenga en cuenta que algunos compiladores anticipados son capaces de hacer trucos típicamente atribuidos a los compiladores JIT. Por ejemplo, optimización interprocedural (o optimización global) y optimización basada en perfiles. GCC y Clang pueden usar ambos trucos, pero la mayoría de las personas los descarta, ya que requiere un trabajo extra (humano) para activarlos. Los compiladores JIT pueden dejar esas opciones habilitadas sin molestar a los usuarios finales.
enorme aumento de rendimiento: No he oído hablar de ningún gran impulso en el rendimiento en general de los compiladores JIT. Los programas C y C++ aún son rápidos sin JIT. Y muchas personas todavía prefieren Fortran para el trabajo numérico (con buenas razones).
Nota al pie: No estoy seguro de su terminología. ¿No son la mayoría de los JIT también compiladores de códigos nativos? Los otros tipos de compiladores además de JIT I llamarían "antes de tiempo" o AOT, o quizás "estático". (Y luego está la línea increíblemente difusa entre "compilado" e "interpretado").
@TimMedora: El enlace parece referirse a las optimizaciones realizadas por el compilador de C-ahead-time, no el compilador de CLR just-in-time. –