2010-01-13 10 views
15

À l'heure actuelle, la plupart des navigateurs traditionnels ont commencé à intégrer l'optimisation des compilateurs JIT à leurs interpréteurs JavaScript/machines virtuelles. C'est bon pour tout le monde. Maintenant, j'aurais du mal à savoir exactement quelles optimisations ils effectuent et comment en tirer le meilleur parti. Quelles sont les références sur les optimisations dans chacun des principaux moteurs JavaScript?Quelles sont les optimisations des moteurs JavaScript modernes?

Contexte:

Je travaille sur un compilateur qui génère JavaScript à partir d'un niveau supérieur & langue plus sûr (plug sans vergogne: on l'appelle OPA et il est très cool) et, compte tenu de la taille des applications que je suis En générant, je voudrais que mon code JavaScript soit aussi rapide et efficace que possible. Je peux gérer des optimisations de haut niveau, mais j'ai besoin d'en savoir plus sur les transformations d'exécution effectuées, afin de savoir quel code de bas niveau produira les meilleurs résultats. Un exemple, du haut de mon esprit: le langage que je compiler intégrera bientôt le support de la paresse. Les moteurs JIT se comportent-ils bien avec des définitions de fonctions paresseuses?

+3

Personnellement, je pense que la meilleure façon de tirer parti des optimisations compilateur/JIT est juste générer votre code aussi naturellement, aussi lisible , et aussi maintenable que possible et laissez le compilateur/jit travailler c'est magique. Toute tentative de cibler spécifiquement les optimisations du compilateur entraînera probablement un code moins maintenable, et dans un an ou deux, lorsque les compilateurs auront tous été modifiés, vos optimisations ne seront plus valides. –

+0

Eh bien, le code lisible/maintenable n'est pas vraiment mon objectif. Je compile à partir d'un langage qui est assez différent de JS, donc je ne m'attends pas à ce que quelqu'un fasse beaucoup de lecture sur le JS généré. Quant à la magie JIT et l'invalidité des optimisations, eh bien, oui, vous avez un point. – Yoric

Répondre

15

This article series traite des optimisations de V8. En résumé:

  • Il génère code machine natif - pas bytecode (V8 Design Elements)
  • précise la collecte des ordures (Wikipedia)
  • mise en cache Inline des méthodes appelées (Wikipedia)
  • Stockage transition de classe pour que les objets ayant les mêmes propriétés soient regroupés (V8 Design Elements)

Les deux premiers points pourraient ne pas vous aider beaucoup dans cette situation. Le troisième pourrait donner un aperçu de la mise en cache des choses. Le dernier peut vous aider à créer des objets avec les mêmes propriétés afin qu'ils utilisent les mêmes classes cachées.

This blog post examine certaines des Optimisations de SquirrelFish Extreme:

  • optimisations bytecode
  • cache en ligne polymorphes (comme V8)
  • Contexte JIT fileté (introduction de la génération de code machine natif, comme V8)
  • Expression régulière JIT

TraceMonkey is optimised via tracing. Je ne sais pas grand-chose mais on dirait qu'il détecte le type d'une variable dans certains codes (code souvent exécuté dans les boucles) et crée un code optimisé en fonction du type de cette variable. Si le type de la variable change, il faut recompiler le code basé sur cela, je dirais que vous devriez éviter de changer le type d'une variable dans une boucle.

+1

La collecte sélective des ordures? ...: S –

+0

Intéressant, merci. Je vais devoir jeter un coup d'oeil aux transitions de classe. Maintenant, sur les autres navigateurs :) – Yoric

+0

V8 matériel lu. TM lu. Lecture de SF. Note de côté: les techniques SF décrites ressemblent, bien, plutôt décevantes. En particulier, comme décrit, leur Threading contextuel est beaucoup plus stupide que la plupart des techniques JIT que je connais. – Yoric