JIT et compilation

Bonjour,

Une langage informatique c’est une représentation d’une logique, celle si peu être orienté facilité (python, php) ou passé un maximum de détails au compilateur et étant proche du hardware (C, C++, ce qui permet de bien meilleur performance). Mais dans tout les cas il peu être compilé, interprété, JIT.

JIT pour wikipedia: Dans le domaine de la programmation informatique, la compilation à la volée, aussi connue sous le nom de traduction dynamique (just-in-time compilation ou JIT compilation en anglais), est une technique visant à améliorer la performance de systèmesbytecode-compilés par la traduction de bytecode en code machine natif au moment de l’exécution. La compilation à la volée se base sur deux anciennes idées : la compilation de bytecode et la compilation dynamique.

Que change le JIT?

  • Cela permet d’exploiter les instructions spéciales du CPU sans tuer la portabilité, si vous voulez utiliser SSE2, SSE4, AVX2, NEON dans votre application en la compilant avec gcc -msse2, … mais l’application crashera sur les cpu n’ayant pas cette instruction
  • En fonction de l’implémentation elle peu avoir des optimisations moins poussé que un compilateur, en échange de moins de temps de compilation. Qui veut attendre 5s avant d’afficher un simple hello world en php? Mais donc potentiellement vas moins loin dans les optimisations (dépends de l’implémentation!).
  • Dans un code compilé:

    var toto=fichier de config[Toto]
    if(toto==X)
    faire une chose
    else
    faire autre chose

    La condition vas toujours être vérifié, pas en JIT. Car le JIT vas détecter que après la première ligne la variable ne vas jamais changer, et donc vas faire cela:

    if(true)//la condition est toujours vraie/fausse car toto ne change jamais après avoir été changer du fichier de config
    faire une chose
    else
    faire autre chose

    Et vas donc finir par ne garder que la branche qui est toujours exécuté:

    faire une chose

    Wikipedia: La prédiction de branchement est une fonctionnalité d’un processeur qui lui permet de prédire le résultat d’un branchement. Cette technique permet à un processeur de rendre l’utilisation de son pipeline plus efficace. Avec cette technique, le processeur va faire de l’exécution spéculative : il va parier sur le résultat d’un branchement, et va poursuivre l’exécution du programme avec le résultat du pari. Si le pari échoue, les instructions chargées par erreur dans le pipeline sont annulées.
    Cela permet donc du diminuer ce besoin hardware, augmenter fortement les performances lors des hardwares n’ayant pas une prédiction de branchement performante. Dans tout les cas il est mieux de sortir les conditions de vos boucles et mettre des boucles différentes dans plusieurs branche, cela fait en effet similaire (mais cela peu varié en fonction du cas).

 

En espérant vous avoir éclairé avec cette article en français.

Publié par