V8 Veröffentlichung v4.6
Etwa alle sechs Wochen erstellen wir im Rahmen unseres Veröffentlichungsprozesses einen neuen Branch von V8. Jede Version wird unmittelbar vor dem Branch von Chrome für einen Chrome-Beta-Meilenstein vom Git-Master von V8 abgezweigt. Heute freuen wir uns, unseren neuesten Branch V8 Version 4.6 vorzustellen, der sich in der Beta-Phase befinden wird, bis er in Abstimmung mit Chrome 46 Stable freigegeben wird. V8 4.6 ist vollgepackt mit allerlei Neuerungen für Entwickler, daher möchten wir Ihnen einen Vorgeschmack auf einige Highlights geben, die in den kommenden Wochen veröffentlicht werden.
Verbesserte Unterstützung für ECMAScript 2015 (ES6)
V8 v4.6 fügt Unterstützung für mehrere ECMAScript 2015 (ES6) Features hinzu.
Spread-Operator
Der Spread-Operator macht die Arbeit mit Arrays wesentlich bequemer. Beispielsweise wird imperativer Code überflüssig, wenn Sie einfach nur Arrays zusammenführen möchten.
// Arrays zusammenführen
// Code ohne Spread-Operator
const inner = [3, 4];
const merged = [0, 1, 2].concat(inner, [5]);
// Code mit Spread-Operator
const inner = [3, 4];
const merged = [0, 1, 2, ...inner, 5];
Eine weitere gute Verwendung des Spread-Operators ist die Ersetzung von apply
:
// Funktionsparameter in einem Array gespeichert
// Code ohne Spread-Operator
function myFunction(a, b, c) {
console.log(a);
console.log(b);
console.log(c);
}
const argsInArray = ['Hi ', 'Spread ', 'operator!'];
myFunction.apply(null, argsInArray);
// Code mit Spread-Operator
function myFunction (a,b,c) {
console.log(a);
console.log(b);
console.log(c);
}
const argsInArray = ['Hi ', 'Spread ', 'operator!'];
myFunction(...argsInArray);
new.target
new.target
ist eines der ES6-Features, die die Arbeit mit Klassen verbessern sollen. Im Hintergrund ist es tatsächlich ein impliziter Parameter für jede Funktion. Wenn eine Funktion mit dem Schlüsselwort new aufgerufen wird, hält der Parameter eine Referenz auf die aufgerufene Funktion. Wenn new nicht verwendet wird, ist der Parameter undefined.
In der Praxis bedeutet das, dass Sie mit new.target herausfinden können, ob eine Funktion normal oder als Konstruktor über das Schlüsselwort new aufgerufen wurde.
function myFunction() {
if (new.target === undefined) {
throw 'Versuchen Sie, es mit new aufzurufen.';
}
console.log('Funktioniert!');
}
// Bricht ab:
myFunction();
// Funktioniert:
const a = new myFunction();
Wenn ES6-Klassen und Vererbung verwendet werden, wird new.target im Konstruktor einer Superklasse an den abgeleiteten Konstruktor gebunden, der mit new aufgerufen wurde. Dies gibt Superklassen während der Konstruktion Zugriff auf das Prototype-Objekt der abgeleiteten Klasse.
Reduzierung von Rucklern
Ruckeln kann nerven, besonders beim Spielen eines Spiels. Oft ist es noch schlimmer, wenn das Spiel mehrere Spieler umfasst. oortonline.gl ist ein WebGL-Benchmark, der die Grenzen aktueller Browser testet, indem er eine komplexe 3D-Szene mit Partikeleffekten und moderner Shader-Rendering rendert. Das V8-Team machte es sich zur Aufgabe, die Leistungsgrenzen von Chrome in solchen Umgebungen auszuloten. Wir sind noch nicht fertig, aber die Früchte unserer Bemühungen zeigen bereits jetzt Wirkung. Chrome 46 zeigt erstaunliche Fortschritte in der oortonline.gl-Leistung, die Sie unten selbst sehen können.
Einige der Optimierungen umfassen:
- Leistungsverbesserungen bei TypedArrays
- TypedArrays werden stark in Rendering-Engines wie Turbulenz (der Engine hinter oortonline.gl) verwendet. Zum Beispiel erstellen Engines oft TypedArrays (wie Float32Array) in JavaScript und übergeben sie nach Anwendung von Transformationen an WebGL.
- Der Schlüsselpunkt war die Optimierung der Interaktion zwischen dem Einbettungsprogramm (Blink) und V8.
- Leistungssteigerungen beim Übergeben von TypedArrays und anderem Speicher von V8 an Blink
- Es ist nicht erforderlich, zusätzliche Handles (die auch von V8 nachverfolgt werden) für TypedArrays zu erstellen, wenn sie als Teil einer Einwegkommunikation an WebGL übergeben werden.
- Beim Erreichen externer (von Blink allokierter) Speichergrenzen starten wir jetzt eine inkrementelle Garbage-Collection anstelle einer vollständigen.
- Planung der Garbage-Collection in Leerlaufzeiten
- Garbage-Collection-Operationen werden während Leerlaufzeiten im Main-Thread geplant, was den Kompositor entlastet und zu einer flüssigeren Darstellung führt.
- Concurrentes Sweepen für die gesamte alte Generation des garbage-collected Heaps aktiviert
- Das Freigeben nicht genutzter Speicherbereiche erfolgt auf zusätzlichen Threads, die gleichzeitig mit dem Haupt-Thread laufen, wodurch die Haupt-Garbage-Collection-Pausenzeit erheblich reduziert wird.
Das Gute daran ist, dass alle Änderungen in Bezug auf oortonline.gl allgemeine Verbesserungen sind, die potenziell alle Nutzer von Anwendungen beeinflussen, die intensiv WebGL nutzen.
V8-API
Bitte sehen Sie sich unsere Zusammenfassung der API-Änderungen an. Dieses Dokument wird regelmäßig einige Wochen nach jeder Hauptversion aktualisiert.
Entwickler mit einem aktiven V8-Checkout können git checkout -b 4.6 -t branch-heads/4.6
nutzen, um die neuen Funktionen in V8 v4.6 zu testen. Alternativ können Sie Chrome's Beta-Kanal abonnieren und die neuen Funktionen bald selbst ausprobieren.