2016-03-10 1 views
0

Je pense qu'il est clair que si nous prenons la ligne juste pour interpréter un code, il sera plus rapide de compiler le même code et de l'exécuter. Ce que je ne comprends pas, c'est comment les compilateurs jit atteignent de meilleures performances (en général) que les langages interprétés sur les serveurs, où vous avez des milliers de connexions - le code doit-il être recompilé pour chaque connexion? Et s'il y a des changements? Merci d'avance de m'avoir aidé à mieux comprendre cela.Comment les compilateurs JIT fonctionnent-ils sur les serveurs?

+0

Le code interprété est du code plus ou moins qui prétend que c'est un processeur exécutant le code de l'utilisateur. Le surcoût est évidemment un peu plus élevé que de simplement exécuter le code de l'utilisateur sur le vrai processeur. Ce que fait un JIT est de savoir où les gains de la compilation d'une partie du code de l'utilisateur sont plus importants à long terme que le temps passé à faire la compilation et à faire la compilation ensuite et seulement ensuite. –

+0

jit compilé sont plus lent que normalement compilé et ensuite exécuté, non? Ce que je ne peux pas comprendre maintenant, c'est l'utilisation de JIT sur les serveurs et ce qui se passerait si le code était modifié. –

Répondre

0

Je dois dire que vous avez extrêmement simplifié la façon dont les interprètes et les compilateurs JIT fonctionnent. Tout d'abord, n'importe quel langage de programmation peut être interprété ou compilé ou même les deux à la fois. Deuxièmement, la performance des programmes écrits dans un langage de programmation est affectée par de nombreux facteurs, dont un seul est de savoir si un interpréteur, un compilateur ou un compilateur JIT est utilisé. Certaines fonctionnalités telles que le typage dynamique, l'envoi dynamique et la liaison tardive sont coûteuses et les programmes qui les utilisent seront plus lents. La syntaxe du langage affecte elle-même les performances. Les interprètes peuvent à la fois utiliser l'optimisation statique, l'optimisation dynamique, l'optimisation de guide de profil hors ligne, l'optimisation guidée par profil en ligne ou les optimisations spécifiques au matériel.

Cependant, pour simplifier les choses. Nous pouvons comparer les interprètes et les compilateurs JIT comme suit. Interpréter une fonction signifie effectuer les étapes suivantes: analyser chaque instruction, l'optimiser, émettre le code machine et enfin l'exécuter. JIT compiler une fonction signifie: analyser toutes les instructions, les optimiser, émettre du code machine et enfin l'exécuter.

Il existe deux différences importantes. Tout d'abord, les interpréteurs analysent la syntaxe du langage de haut niveau tandis que les compilateurs JIT analysent la syntaxe du langage de niveau intermédiaire. Par conséquent, les compilateurs JIT effectuent cette étape beaucoup plus rapidement. Deuxièmement, les compilateurs JIT peuvent mieux optimiser le code en considérant toutes les instructions en même temps tandis que les interpréteurs purs optimisent une instruction à la fois. Par conséquent, les performances du code binaire émis seront meilleures lors de l'utilisation de compilateurs JIT.

Comme vous pouvez le constater, les compilateurs JIT offrent davantage d'opportunités de performances que les interpréteurs. Cela s'applique indépendamment du fait que vous soyez sur un client ou un serveur. Notez qu'une fois qu'une fonction est compilée par JIT, il n'est pas nécessaire de la compiler à nouveau. Par conséquent, seule la première requête de l'utilisateur entraînera une surcharge de compilation. Tous les autres sont traités à pleine vitesse.

+0

En fait, la plupart des langages interprétés sur les serveurs (Python, Ruby, même PHP de nos jours) sont compilés en bytecode lors du chargement et de l'exécution dans une machine virtuelle, ce qui fait que la plupart des optimisations sont effectuées. Pourtant, l'exécuter dans une machine virtuelle est plus lent qu'avec JIT lorsqu'il est exécuté encore et encore. – StenSoft

+0

@StenSoft Server-side Python et d'autres langages sont compilés. Pourquoi les appelez-vous "langages interprétés"? Aussi ce bytecode obtient JIT compilé en code binaire, donc plus lent que quoi exactement? –

+0

[Vous pouvez vérifier ce que signifie la langue interprétée] (https://en.wikipedia.org/wiki/Interpreter_ (computing)). Python, Ruby ou PHP n'ont pas (dans leur implémentation de référence) de compilateurs JIT et sont exécutés dans une VM qui interprète le bytecode. C'est plus lent que d'exécuter du code natif produit par le compilateur JIT. – StenSoft