58 votes

Les Moteurs Javascript Avantages

Je suis confus au sujet de moteurs JavaScript droit maintenant. Je sais que le V8 a été un gros problème car il JavaScript compilé en code natif.

Puis j'ai commencé à lire sur Mozilla SpiderMonkey, qui d'après ce que je comprends, c'est écrit en C et permet de compiler en JavaScript. Alors, comment est-ce différent de V8 et si cela est vrai, pourquoi est-ce que Firefox de ne pas le faire?

Enfin, ne Rhino littéralement compiler le code JavaScript pour Java byte code donc, vous obtiendrez toutes les vitesse avantages de Java? Si non, pourquoi les gens de ne pas exécuter V8 lors de l'écriture de scripts sur leurs ordinateurs de bureau?

80voto

Ted Mielczarek Points 1996

Il existe différentes approches pour l'exécution de JavaScript, même dans le cas d'JIT. V8 et Nitro (anciennement connu sous le SquirrelFish Extrême) choisir de faire un ensemble de méthode JIT, ce qui signifie qu'ils compiler tous les code JavaScript en bas natif instructions lorsqu'ils rencontrent un script, et puis exécutez simplement que s'il a été compilé en code C. SpiderMonkey utilise un "traçage" JIT au lieu de cela, qui compile le script de bytecode, et l'interprète, mais surveille l'exécution, à la recherche de "points chauds" tels que les boucles. Lorsqu'il détecte un, il compile puis juste que chaude chemin en code machine et l'exécute dans l'avenir.

Les deux approches ont leurs avantages et inconvénients. Tout-méthode JIT s'assure que tous les JavaScript qui est exécutée sera compilé et exécuté en tant que code machine et non interprété, qui, en général, devrait être plus rapide. Toutefois, en fonction de la mise en œuvre, il peut signifier que le moteur passe de temps en temps la compilation d'un code qui ne sera jamais exécutée ou ne peut être exécuté qu'une fois, et n'est pas critique pour les performances. En outre, ce code compilé doit être stockée dans la mémoire, donc cela peut entraîner une augmentation de l'utilisation de la mémoire.

Le traçage JIT mises en œuvre dans la SpiderMonkey peut produire extrêmement spécialisé de code par rapport à un ensemble de méthode JIT, depuis qu'il a déjà exécuté le code et peut spéculer sur les types de variables (telles que le traitement de l'index de la variable dans une boucle for comme un natif entier), où un ensemble de méthode JIT aurait pour traiter la variable comme un objet, car le JavaScript est typées et le type de changement (SpiderMonkey sera tout simplement "tomber" trace si l'hypothèse d'échec, et de revenir à l'interprétation du bytecode). Cependant, SpiderMonkey de dépistage de la JIT actuellement ne fonctionne pas efficacement sur le code, avec beaucoup de branches, comme les traces sont optimisés pour une seule chemins d'exécution. En outre, il ya des coûts impliqués dans le suivi de l'exécution avant de décider de compiler une trace, et puis en passant l'exécution de ce suivi. Aussi, si le traceur de fait une hypothèse qui est violé (comme une variable de changement de type), le coût de tomber trace et revenir à l'interprétation est susceptible d'être plus élevée qu'avec l'ensemble de la méthode de JIT.

12voto

adamJLev Points 5892

V8 est le plus rapide, car il compile tous les JS en code machine.

SpiderMonkey (ce FF utilise) est trop rapide, mais compile intermédiaire de byte-code, pas du code machine. C'est la grande différence avec la V8. EDIT - la plus Récente de Firefox communiqués de venir avec une nouvelle variante de SpideMonkey; TraceMonkey. TraceMonkey n'compilation JIT de pièces critiques, et peut-être d'autres smart optimisations.

Rhino compile le code Javascript en Java les classes, vous permettant ainsi de essentiellement écrire "Java" applications en Javascript. Rhino est également utilisé comme une façon d'interpréter JS dans le backend et le manipuler, et d'avoir une totale compréhension du code, telles que la réflexion. Ceci est utilisé par exemple par le YUI Compressor.

La raison pour laquelle Rhino est utilisé à la place du V8 de tous les coins de la place est probablement parce que le V8 est relativement nouveau, de sorte que beaucoup de projets ont déjà été à l'aide de Rhino/Spidermonkey que leur JS moteur, par exemple Yahoo widgets. (Je suppose que c'est ce à quoi vous faites allusion, avec des "scripts sur leurs postes de travail")

edit- Ce lien peut aussi donner un aperçu de pourquoi SpiderMonkey est donc largement adopté. http://stackoverflow.com/questions/93692/which-javascript-engine-would-you-embed-in-an-application

6voto

linguanerd Points 471

Si vous voulez voir comment les différents navigateur Javascript moteurs de pile en place, installer Safari 4 (oui, il fonctionne sur Windows maintenant trop!), Chrome V8, Firefox 3.5, et IE 8 (si vous êtes sur windows) et de relancer le test.

http://www2.webkit.org/perf/sunspider-0.9/sunspider.html

Je crois que Pointu dit ci-dessus, le nouveau Firefox 3.5 utilise TraceMonkey qui compile également à intermedit code à la volée en utilisant une certaine forme de JIT. Donc il faut comparer V8 assez favorablement. Au moins, il ne sera pas 10x plus lent que le V8 comme Firefox 3 SpiderMonkey (sans JIT) a été.

Pour moi... safari 4.0.3 a été de 2,5 x plus rapide que Tracemonky dans Firefox 3.5.3 sous Win XP. IE8 a été beaucoup plus lente. Je n'ai pas de Chrome d'installé pour le moment.

Ne sais pas à propos de Rhino compilation pour le bytecode java. Si elle est encore à l'interprétation de la dynamique des fonctionnalités de Javascript, comme la possibilité d'ajouter des attributs à des instances de l'objet au moment de l'exécution (exemple obj.someNewAttribute="someValue" ce qui est permis en Javascript)... je ne suis pas sûr de ce qu'il est entièrement compilé en bytecode, et vous ne pourriez pas obtenir une meilleure performance autre que vous n'avez pas à compiler du code source Javascript texte à chaque fois que votre Javascript s'exécute. Rappelez-vous que Javascript permet très dynamique de la syntaxe comme eval("x=10;y=20;z=x*y"); ce qui signifie que vous pouvez construire des chaînes de code compilé au moment de l'exécution. C'est pourquoi je pense Rhino serait en mode mixte interprété/compilé, même si vous n'avez compile en bytecode JVM.

La JVM est toujours un interprète, mais très bonne avec des JIT soutien. Donc, je pense, de Rhino-sur-JVM 2 interprète couches (interprète-sur-interprète) ou d'un interprète^2. Alors que la plupart de vos autres moteurs Javascript sont écrits en C, et en tant que telle doit effectuer plus comme interprète^1. Chaque interprète couche peut ajouter 5 à 10 fois la dégradation des performances par rapport à C ou C++ (réf Perl ou Python ou Ruby par exemple), mais avec JIT l'impact sur les performances peut être beaucoup plus faible de l'ordre de 2-4x. Et la JVM est l'un des plus robuste et mature JIT moteurs jamais.

Donc, votre kilométrage peut certainement varier et vous serait probablement bénéfique pour certains graves repères si vous voulez une vraie réponse pour votre application sur votre propre matériel et système d'exploitation.

Rhino ne peut pas être trop terriblement lent, car je sais que beaucoup de gens l'utilisent. Je pense que c'est la principale appel n'est pas sa vitesse, mais le fait qu'il est facile à code/lumière-poids/intégrable/interprète qui a des crochets dans les bibliothèques Java, ce qui le rend parfait pour l'écriture de scripts de configuration//extensibilité de votre projet de logiciel. Certains éditeurs de texte comme UltraEdit sont même l'incorporation de Javascript comme une alternative macro moteur de script. Chaque programmeur semble être en mesure de tomber à l'aide de javascript assez facilement, il est donc facile de ramasser ainsi.

L'un des avantages de Rhino est qu'il fonctionne à peu près partout la JVM s'exécute. Dans mon expérience, en essayant d'obtenir autonome TraceMonkey ou SpiderMonkey construire et exécuter en ligne de commande peut être un peu douloureux sur les systèmes comme Windows. Et de l'incorporer dans votre propre application peut être même plus de temps. Mais le retour sur investissement pour avoir une intégrable langue serait-il intéressant pour un grand projet, par rapport à avoir à "rouler propre" mini solution de script si c'est ce que vous cherchez à faire.

Script avec Rhino est vraiment facile si vous avez Java et le rhino pot, il vous suffit d'écrire votre code javascript et l'exécuter en ligne de commande. Je l'utilise tout le temps pour des tâches simples.

3voto

Zied Points 1038

Pour répondre à la question, pourquoi en code natif Vs Byte code...

Le code natif est plus rapide et pour google, un choix stratégique, car ils ont un plan de JS l'un d'eux au moins est ChromeOS.

Une bonne vidéo sur cette question est affiché sur Channel 9 avec une interview de Lars Bak, l'homme derrière V8 peut être trouvé ici

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X