Fondamentalement, les compilateurs JIT a une chance de réellement profil de l'application en cours d'exécution, et faire allusion en se basant sur cette information.
"hors connexion" compilateurs ne sera pas en mesure de déterminer la façon dont souvent une branche sauts et combien de fois il tombe à travers, sans nécessiter l'insertion d'un code spécial, demander au dev pour exécuter le programme, de le mettre à l'épreuve, et de recompiler.
Pourquoi est-ce important?
//code before
if(errorCondition)
{
//error handling
}
//code after
Est converti en quelque chose comme:
//code before
Branch if not error to Code After
//error handling
Code After:
//Code After
Et des processeurs x86 serait pas de prévoir un saut conditionnel à l'avance en l'absence d'information de la direction de la prévision de l'unité. Cela signifie qu'il prévoit le code de gestion d'erreur à l'exécution, et le processeur va devoir vider le pipeline lorsqu'il détermine que la condition d'erreur n'a pas eu lieu.
Un compilateur JIT pouvais le voir et insérer une indication de la direction générale, de sorte que le CPU serait à prévoir dans le bon sens. Accordé, hors les compilateurs peuvent structurer le code de manière à éviter la mispredict, mais si jamais vous avez besoin de regarder à l'assemblée, vous pouvez ne pas aimer, il saute partout....