Vorteile von Javascript-Engines

Lesezeit: 8 Minuten

Benutzer-Avatar
Jan

Ich bin gerade verwirrt über JavaScript-Engines. ich weiß das V8 war eine große Sache, weil es JavaScript in nativen Code kompilierte.

Dann fing ich an, darüber zu lesen Mozilla SpiderMonkey, die meines Wissens nach in C geschrieben ist und JavaScript kompilieren kann. Wie unterscheidet sich das also von V8 und wenn das stimmt, warum macht Firefox das nicht?

Schließlich tut Nashorn Kompilieren Sie buchstäblich den JavaScript-zu-Java-Bytecode, damit Sie alle Geschwindigkeitsvorteile von Java nutzen können? Wenn nicht, warum führen Leute V8 nicht aus, wenn sie Skripte auf ihren Desktops schreiben?

Es gibt verschiedene Ansätze für die JavaScript-Ausführung, auch bei JIT. V8 und Nitro (früher bekannt als SquirrelFish Extreme) entscheiden sich für ein JIT mit vollständiger Methode, was bedeutet, dass sie den gesamten JavaScript-Code zu nativen Anweisungen kompilieren, wenn sie auf ein Skript stoßen, und das dann einfach ausführen, als wäre es kompilierter C-Code. SpiderMonkey verwendet stattdessen ein „Tracing“-JIT, das das Skript zunächst in Bytecode kompiliert und interpretiert, aber die Ausführung überwacht und nach „Hot Spots“ wie Schleifen sucht. Wenn es einen erkennt, kompiliert es dann genau diesen heißen Pfad zum Maschinencode und führt ihn in Zukunft aus.

Beide Ansätze haben Vor- und Nachteile. Whole-Method-JIT stellt sicher, dass das gesamte ausgeführte JavaScript als Maschinencode kompiliert und ausgeführt und nicht interpretiert wird, was im Allgemeinen schneller sein sollte. Abhängig von der Implementierung kann dies jedoch bedeuten, dass die Engine Zeit damit verbringt, Code zu kompilieren, der nie ausgeführt wird oder nur einmal ausgeführt werden kann und nicht leistungskritisch ist. Außerdem muss dieser kompilierte Code im Speicher abgelegt werden, was zu einer höheren Speicherauslastung führen kann.

Das Tracing-JIT, wie es in SpiderMonkey implementiert ist, kann im Vergleich zu einem Whole-Method-JIT extrem spezialisierten Code erzeugen, da es den Code bereits ausgeführt hat und über die Typen von Variablen spekulieren kann (z. B. die Behandlung der Indexvariable in einer for-Schleife als native Ganzzahl). ), wobei ein Whole-Method-JIT die Variable als Objekt behandeln müsste, da JavaScript nicht typisiert ist und sich der Typ ändern könnte (SpiderMonkey „fällt“ einfach von der Ablaufverfolgung ab, wenn die Annahme fehlschlägt, und kehrt zum Interpretieren von Bytecode zurück). Das Tracing-JIT von SpiderMonkey funktioniert derzeit jedoch nicht effizient bei Code mit vielen Verzweigungen, da die Traces für einzelne Ausführungspfade optimiert sind. Darüber hinaus ist die Überwachung der Ausführung mit einigem Overhead verbunden, bevor entschieden wird, einen Trace zu kompilieren, und dann die Ausführung auf diesen Trace umgestellt wird. Auch wenn der Verfolger eine Annahme trifft, die später verletzt wird (z. B. eine Variable, die den Typ ändert), sind die Kosten für das Verlassen der Verfolgung und das Zurückwechseln zum Interpretieren wahrscheinlich höher als bei einer Ganzmethoden-JIT.

  • Beachten Sie, dass Firefox in den vergangenen Jahren dazu übergegangen ist, ein Whole-Method-JIT sowie „JaegerMonkey“ zu verwenden und das Tracing-JIT fallen zu lassen.

    – Ted Mielczarek

    8. August 2012 um 13:41 Uhr

Benutzer-Avatar
adamJLev

V8 ist am schnellsten, weil es alle JS in Maschinencode kompiliert.

SpiderMonkey (was FF verwendet) ist auch schnell, kompiliert jedoch zu einem Zwischenbytecode, nicht zu Maschinencode. Das ist der große Unterschied zum V8. BEARBEITEN – Neuere Firefox-Versionen enthalten eine neuere Variante von SpideMonkey; TraceMonkey. TraceMonkey führt die JIT-Kompilierung kritischer Teile und möglicherweise andere intelligente Optimierungen durch.

Rhino kompiliert Javascript in Java-Klassen, wodurch Sie grundsätzlich „Java“-Anwendungen in Javascript schreiben können. Rhino wird auch verwendet, um JS im Backend zu interpretieren und zu manipulieren und ein vollständiges Code-Verständnis zu haben, z. B. Reflektion. Dies wird beispielsweise vom YUI Compressor verwendet.

Der Grund, warum überall Rhino anstelle von V8 verwendet wird, liegt wahrscheinlich darin, dass V8 relativ neu ist, sodass viele Projekte bereits Rhino/Spidermonkey als ihre JS-Engine verwenden, zum Beispiel Yahoo-Widgets. (Ich nehme an, darauf beziehen Sie sich mit “Skripts auf ihren Desktops”)

Bearbeiten- Dieser Link könnte auch einen Einblick geben, warum SpiderMonkey so weit verbreitet ist. Welche Javascript-Engine würden Sie in Ihre Anwendung einbetten?

  • Umm TraceMonkey macht auch JIT-Übersetzungen in Maschinencode … Ich glaube auch nicht, dass es überhaupt richtig ist zu sagen, dass V8 JavaScript in Maschinencode “kompiliert” – es ist mehr oder weniger die gleiche Art von JIT-Ansatz wie TraceMonkey.

    – Spitze

    26. Januar 2010 um 4:10 Uhr


  • @Pointy, Der Unterschied AFAIK zwischen TraceMonkey und V8 besteht darin, dass TraceMonkey in Zwischencode kompiliert wird, von denen einige JIT bei der Ausführung in Maschinencode kompiliert werden. V8 kompiliert alles direkt in Maschinencode.

    – Matthew Crumley

    26. Januar 2010 um 4:39 Uhr


  • “V8 kompiliert JavaScript-Quellcode direkt in Maschinencode, wenn er zum ersten Mal ausgeführt wird. Es gibt keine dazwischen liegenden Bytecodes, keinen Interpreter.” Quelle: code.google.com/apis/v8/design.html Also im Grunde eine Kompilierung, wie es ein C-Compiler tun würde. Außerdem kompiliert V8 alle JS und TraceMonkey führt JIT durch

    – adamJLev

    26. Januar 2010 um 4:56 Uhr


Benutzer-Avatar
Linguanerd

Wenn Sie sehen möchten, wie sich die verschiedenen In-Browser-JavaScript-Engines stapeln, installieren Sie Safari 4 (ja, es läuft jetzt auch unter Windows!), Chrome V8, Firefox 3.5 und IE 8 (wenn Sie Windows verwenden) und führen Sie den Benchmark aus :

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

Ich glaube, wie Pointy oben sagte, dass der neue Firefox 3.5 TraceMonkey verwendet, das auch kompiliert, um Code on the fly mit einer Form von JIT zu vermitteln. Es sollte also im Vergleich zu V8 etwas günstig sein. Zumindest wird es nicht 10x langsamer als V8 sein, wie es Firefox 3 SpiderMonkey (ohne JIT) war.

Für mich … war Safari 4.0.3 2,5-mal schneller als Tracemonky in Firefox 3.5.3 unter Win XP. IE8 war viel viel langsamer. Ich habe Chrome im Moment nicht installiert.

Ich weiß nicht, wie Rhino in Java-Bytecode kompiliert. Wenn es immer noch die dynamischen Funktionen von Javascript interpretiert, wie z. B. das Hinzufügen von Attributen zu Objektinstanzen zur Laufzeit (Beispiel obj.someNewAttribute=”someValue”, das in Javascript zulässig ist) … bin ich mir nicht so sicher, ob es vollständig “kompiliert ” in Bytecode, und Sie erhalten möglicherweise keine bessere Leistung, außer dass Sie nicht jedes Mal, wenn Ihr Javascript ausgeführt wird, aus dem Javascript-Quellcodetext kompilieren müssen. Denken Sie daran, dass Javascript eine sehr dynamische Syntax wie eval(“x=10;y=20;z=x*y”); was bedeutet, dass Sie Code-Strings aufbauen können, die zur Laufzeit kompiliert werden. Aus diesem Grund würde ich denken, dass Rhino im gemischten Modus interpretiert/kompiliert wird, selbst wenn Sie in JVM-Bytecode kompiliert haben.

Die JVM ist immer noch ein Interpreter, wenn auch ein sehr guter mit JIT-Unterstützung. Daher stelle ich mir Rhino-on-JVM gerne als 2 Interpreter-Schichten (Interpreter-on-Interpreter) oder Interpreter^2 vor. Während die meisten Ihrer anderen Javascript-Engines in C geschrieben sind und daher eher wie interpreter^1 funktionieren sollten. Jede Interpreterschicht kann im Vergleich zu C oder C++ (z. B. Perl oder Python oder Ruby) zu einer 5- bis 10-fachen Leistungsminderung führen, aber mit JIT kann die Leistungseinbuße in der Größenordnung von 2-4 x viel geringer sein. Und die JVM hat eine der robustesten und ausgereiftesten JIT-Engines aller Zeiten.

Ihre Laufleistung wird also definitiv variieren, und Sie würden wahrscheinlich davon profitieren, einige ernsthafte Benchmarks durchzuführen, wenn Sie eine echte Antwort für Ihre beabsichtigte Anwendung auf Ihrer eigenen Hardware und Ihrem eigenen Betriebssystem erhalten möchten.

Rhino kann nicht zu langsam sein, da ich weiß, dass viele Leute es verwenden. Ich denke, der Hauptanreiz liegt nicht in der Geschwindigkeit, sondern in der Tatsache, dass es einfach zu programmieren/leichtgewichtig/einbettbar/Interpreter ist, der Hooks in Java-Bibliotheken hat, was es perfekt für die Skripterstellung/Konfiguration/Erweiterbarkeit Ihres Softwareprojekts macht. Einige Texteditoren wie UltraEdit betten sogar Javascript als alternative Makro-Scripting-Engine ein. Jeder Programmierer scheint in der Lage zu sein, ziemlich leicht durch Javascript zu stolpern, also ist es auch leicht zu verstehen.

Ein Vorteil von Rhino ist, dass es so ziemlich überall läuft, wo auch die JVM läuft. Meiner Erfahrung nach kann der Versuch, eigenständige TraceMonkey oder SpiderMonkey zum Erstellen und Ausführen über die Befehlszeile zu bekommen, auf Systemen wie Windows etwas schmerzhaft sein. Und das Einbetten in Ihre eigene Anwendung kann noch zeitaufwändiger sein. Aber die Amortisation einer integrierbaren Sprache wäre es für ein großes Projekt wert, im Vergleich dazu, dass Sie Ihre eigene Mini-Skripting-Lösung „rollen“ müssen, wenn Sie das tun möchten.

Das Skripting mit Rhino ist wirklich einfach, wenn Sie Java und das Rhino-Jar haben, Sie schreiben einfach Ihr Javascript und führen es von der Befehlszeile aus. Ich benutze es die ganze Zeit für einfache Aufgaben.

  • Ich habe Chrome 4 auf meinem XP-Rechner installiert und es führt die Sunspider-Benchmarks etwa dreimal schneller aus als Firefox 3.5.3 Tracemonkey. Außerdem entdeckte ich, dass V8 im Vergleich zu meiner früheren Erfahrung mit SpiderMonkey angenehm einfach herunterzuladen und zu erstellen ist. Natürlich braucht man svn + python 2.4 + scons 1.0.0 + Visual Studio 2005/2008 (VC++ 2008 Free Edition funktioniert angeblich auch), was ich bereits auf meinem Entwickler-PC hatte. Um fair zu sein, vielleicht gehe ich zurück und versuche es noch einmal mit TraceMonkey, um zu sehen, wie es sich heutzutage schlägt.

    – Linguanerd

    26. Januar 2010 um 13:24 Uhr

  • Beachten Sie, dass Sunspider nicht die einzige Antwort ist, es ist nur ein JavaScript-Benchmark (wenn auch einer, für den die Autoren der JavaScript-Engine stark optimiert haben).

    – Ted Mielczarek

    27. Januar 2010 um 13:58 Uhr

  • VC++ 2008 Express (kostenlos) funktioniert zum Kompilieren von v8 mit Scons, hat es Anfang dieser Woche getan.

    – Feuerkrähe

    19. Mai 2010 um 21:09 Uhr


Um die Frage zu beantworten, warum nativer Code Vs Byte-Code …

Der native Code ist schneller und für Google eine strategische Wahl, da sie JS planen, zumindest einer davon ist ChromeOS.

Ein gutes Video zu dieser Frage ist auf Channel9 mit einem Interview mit Lars Bak, dem Mann hinter V8, zu finden hier

1043430cookie-checkVorteile von Javascript-Engines

This website is using cookies to improve the user-friendliness. You agree by using the website further.

Privacy policy