Leistungsrichtlinien für Async / Warten in Knoten Version 8

9

async/await ist mit der Knotenversion 8 verfügbar. Der Code ist nativ erstmals in nodejs linear. Das ist nett. Früher behaupteten viele Artikel, dass in der JavaScript-Engine v8 eine Funktion mit try/catch block nicht optimiert ist. Jetzt benötigt async/await try/catch Blöcke, um mit Fehlern umzugehen. Also, als Entwickler was muss getan werden, um die gleiche Leistung zu halten?

    
explorer 29.09.2017, 04:13
quelle

2 Antworten

5

try/catch hat TurboFan-Optimierungen beim Commit erhalten 9aac80f für V8 5.3 (Node v7.x und darüber). Dies bedeutet, dass die historische Aussage, dass try/catch eine schlechte Leistung hat, nicht mehr zutrifft.
Aus Blogpost von V8 :

  

In der Vergangenheit hatten V8's Schwierigkeiten, die Art von Sprachfunktionen zu optimieren, die in ES2015 + zu finden sind. Zum Beispiel ist es niemals möglich geworden, Exception Handling (d. H.% Co_de%) Unterstützung für Crankshaft, den klassischen Optimierungscompiler von V8, hinzuzufügen. Dies bedeutete, dass die Fähigkeit von V8 zur Optimierung einer ES6-Funktion wie try/catch/finally , die im Wesentlichen eine implizite finally-Klausel hat, begrenzt war. Die Einschränkungen von Crankshaft und die Komplexität beim Hinzufügen neuer Sprachfeatures zu Fullcodegen, dem V8-Compiler, machten es inhärent schwierig, sicherzustellen, dass neue ES-Funktionen in V8 so schnell hinzugefügt und optimiert wurden, wie sie standardisiert waren.

     

Glücklicherweise wurden Ignition und TurboFan (die neue Interpreter- und Compiler-Pipeline von V8) entwickelt, um die gesamte JavaScript-Sprache von Anfang an zu unterstützen, einschließlich erweitertem Kontrollfluss, Ausnahmebehandlung und zuletzt for...of und Destrukturierung von ES2015. Die enge Integration der Architektur von Ignition und TurboFan ermöglicht es, schnell neue Funktionen hinzuzufügen und sie schnell und inkrementell zu optimieren.

for...of in einer Funktion try/catch ist nur syntaktischer Zucker über eine Methode Promise async und .then und die Leistung wird daher von der zugrunde liegenden Promise-Implementierung bestimmt. Bluebird Ansprüche haben eine bessere Leistung als native Promise-Implementierungen, so dass theoretisch - wenn das, was Bluebird behauptet, wahr ist - Sie bessere Ergebnisse erzielen .catch Leistung durch Überschreiben der systemeigenen Promise-Implementierung mit der Promise-Implementierung von Bluebird.
Zum Beispiel in Knoten: try/catch oder const Promise = require("bluebird") , um es global zu überschreiben.

Beachten Sie jedoch, dass sich dies in der Zukunft ändern könnte, da die ursprüngliche Promise-Implementierung in JavaScript erfolgte, aber kürzlich in C ++ erneut implementiert wurde, wie in Bug # 5343 .

    
Svenskunganka 29.09.2017 04:39
quelle
1

Ich habe eine Leistung nativer ES2015-Versprechungen und ES2017-Async-Funktionen gefunden in Node.js v8

  

Leistung von Callbacks vs Versprechen gegenüber Async-Funktionen in Node.js v8

     

Sowohl native Chrome V8 ES2015-Versprechen als auch ES2017-Async-Funktionen   Führen Sie ungefähr 2 mal langsamer als Bluebird verspricht mit fast 2   mal mehr Speicher

und

  

Fazit

     

Node.js v8 bietet eine deutlich verbesserte native-Leistung   ES2015 verspricht und ES2017 asynchrone Funktionen, weiter verstärkt durch die   Einführung von nativen util.promisify.

    
ponury-kostek 29.09.2017 08:26
quelle

Tags und Links