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?
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 .
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.
Tags und Links javascript node.js v8