async/await jest dostępny z WARTOŚCIĄ WERSJĄ 8. Kod jest liniowy po raz pierwszy w Nodejs, natiwnie. To miłe. Wcześniej wiele artykułów twierdziło, że w silniku JavaScript V8 funkcja z blokiem try/catch nie jest zoptymalizowana. Teraz, async/await wymaga bloków try/catch, aby poradzić sobie z błędami. Więc jako programista, co należy zrobić, aby zachować tę samą wydajność?

10
explorer 29 wrzesień 2017, 07:13

2 odpowiedzi

Najlepsza odpowiedź

try/catch Otrzymano optymalizacje turbofan w zatwierdzeniu {x1}} dla V8 {{ X2}} (węzeł v7.x i powyżej). Oznacza to, że historyczne oświadczenie, że try/catch ma złe wyniki, nie jest już prawdziwe.
Z V8 Post:

W ciągu ostatnich V8 miały trudności z optymalizacją rodzajów funkcji językowych, które znajdują się w ES2015 +. Na przykład, nigdy nie stało się możliwe, aby dodać obsługę wyjątku (I.E. {X0}}) wsparcia dla wału korbowego, klasycznego optymalizacji kompilatora V8. To oznaczało zdolność V8 do optymalizacji funkcji ES6, jak for...of, co zasadniczo ma ukrytą klauzulę wreszcie, był ograniczony. Ograniczenia wału korbowego i ogólna złożoność dodania nowych funkcji językowych do pełnokolegenowego kompilatora V8, uczyniły go z natury trudne do zapewnienia nowych funkcji ES i zoptymalizowane w V8 tak szybko, jak zostały znormalizowane.

Na szczęście zapłon i Turbofan (nowa rurociąg interpretacyjny V8), zostały zaprojektowane, aby wspierać cały język JavaScript od samego początku, w tym zaawansowany przepływ kontrolny, obsługę wyjątkową, a ostatnio {X0}} i destrucing z ES2015. Drobna integracja architektury zapłonu i Turbofan umożliwia szybkie dodanie nowych funkcji i optymalizacji ich szybko i stopniowo.


try/catch Funkcja async jest tylko cukrem syntatykiem nad obietnicą {X2}} i .catch metody, a wydajność jest zatem określona przez podstawową realizację obietnicy. Bluebird Roszczenia, aby mieć lepszą wydajność niż rodzimy obietnicy wdrożenia, tak teoretycznie - jeśli roszczenia bluebird są prawdziwe - Osiągniesz lepsze wyniki try/catch, nadając nadrzędną realizację obietnicy z realizacją obietnicą Bluebird.
Na przykład w węźle: const Promise = require("bluebird"), lub global.Promise = require("bluebird"), aby go zastąpić na całym świecie.

Zauważ jednak, że może to zmienić w przyszłości, ponieważ oryginalna implementacja obietnica była w JavaScript, ale ostatnio została ponownie wdrożona w C ++, jak można śledzić w Bug # 5343.

13
Community 20 czerwiec 2020, 09:12

Znalazłem Wydajność natywnych Obietnic ES2015 i ES2017 Async Funkcje w Node.js v8

Wydajność wywołania zwrotów VS obietnice VS Async w Node.js v8

Zarówno obiecujące obietnice Chrome V8 ES2015, jak i ES2017 Async Funkcje wykonują mniej więcej 2 razy wolniej niż Bluebird obietnice przy użyciu prawie 2 razy więcej pamięci

I

Wniosek

Węzeł

3
ponury-kostek 29 wrzesień 2017, 08:26