2010-01-13 8 views
15

Inzwischen haben die meisten Mainstream-Browser damit begonnen, optimierte JIT-Compiler in ihre JavaScript-Interpreter/virtuellen Maschinen zu integrieren. Das ist gut für alle. Nun wäre es mir schwer, genau zu wissen, welche Optimierungen sie durchführen und wie sie am besten genutzt werden können. Was sind Verweise auf Optimierungen in den einzelnen JavaScript-Engines?Welche Optimierungen machen moderne JavaScript-Engines?

Hintergrund:

Ich arbeite an einem Compiler, den JavaScript von einer höheren Ebene erzeugt & sichere Sprache (schamlose Werbung: es OPA genannt und es ist sehr cool) und angesichts der Größe von Anwendungen, die ich bin Ich möchte, dass mein JavaScript-Code so schnell und so speichereffizient wie möglich ist. Ich kann High-Level-Optimierungen durchführen, aber ich muss mehr darüber wissen, welche Laufzeittransformationen durchgeführt werden, um zu wissen, welcher Low-Level-Code die besten Ergebnisse liefert.

Ein Beispiel, von ganzem Herzen: die Sprache, die ich kompiliere wird bald Unterstützung für Faulheit integrieren. Funktioniert JIT-Engines mit Lazy-Funktionsdefinitionen?

+3

Ich persönlich denke, die beste Möglichkeit, die Vorteile von Compiler/JIT-Optimierungen zu nehmen ist ebenso selbstverständlich, Ihren Code zu generieren, so lesbar und so wartbar wie möglich und lassen Sie den Compiler/Jit arbeiten, es ist Magie. Jeder Versuch, gezielt auf Compiler-Optimierungen abzuzielen, führt wahrscheinlich zu weniger wartungsfähigem Code, und in ein oder zwei Jahren, wenn die Compiler alle geändert wurden, sind Ihre Optimierungen nicht mehr gültig. –

+0

Nun, lesbarer/wartbarer Code ist nicht wirklich mein Ziel. Ich kompiliere aus einer Sprache, die sich stark von JS unterscheidet, also erwarte ich nicht, dass irgendjemand viel auf dem generierten JS liest. Wie für JIT Magie und Ungültigkeit von Optimierungen, nun, ja, Sie haben einen Punkt. – Yoric

Antwort

15

This article series diskutiert die Optimierungen von V8. Zusammengefasst:

  • Es erzeugt nativen Maschinencode - nicht Bytecode (V8 Design Elements)
  • Precise Garbage Collection (Wikipedia)
  • Inline-Caching von aufgerufenen Methoden (Wikipedia)
  • Speichern Klassenübergang Informationen, so dass Objekte mit denselben Eigenschaften gruppiert werden (V8 Design Elements)

Die ersten beiden Punkte können Ihnen in dieser Situation nicht sehr helfen. Die dritte könnte einen Einblick geben, wie Dinge zusammengespeichert werden können. Die letzte kann Ihnen helfen, Objekte mit denselben Eigenschaften zu erstellen, so dass sie dieselben versteckten Klassen verwenden.

This blog post beschreibt einige der Optimierungen von SquirrelFish Extreme:

  • Bytecode-Optimierungen
  • polymorphe Inline-Cache (wie V8)
  • Kontext Gewinde JIT (Einführung von nativen Maschinencode-Generierung, wie V8)
  • Regulärer Ausdruck JIT

TraceMonkey is optimised via tracing. Ich weiß nicht viel darüber, aber es sieht aus, als ob es den Typ einer Variablen in einigen "Hot-Code" (Code in Schleifen häufig ausgeführt) erkennt und erstellt optimierten Code basierend auf dem Typ der Variablen. Wenn sich der Typ der Variablen ändert, muss er den Code neu kompilieren. Davon ausgehend würde ich sagen, dass Sie den Typ einer Variablen innerhalb einer Schleife nicht ändern sollten.

+1

Präzise Speicherbereinigung? ...: S –

+0

Interessant, danke. Ich muss mir Klassenübergänge ansehen. Nun zu den anderen Browsern :) – Yoric

+0

V8 Material lesen. TM lesen. SF lesen. Randnotiz: Die beschriebenen SF-Techniken sehen gut aus, irgendwie enttäuschend. Besonders, wie beschrieben, sieht ihr Context-Threading viel dümmer aus als die meisten bekannten JIT-Techniken. – Yoric