async/await
is available with node version 8. The code is linear for the first time in nodejs, natively. That is nice. Earlier many articles claimed that, in v8 javascript engine, a function with try/catch
block is not optimized. Now, async/await
requires try/catch
blocks to deal with errors. So, as a developer what needs to be done to keep same the performance?
async/await
is available with node version 8. The code is linear for the first time in nodejs, natively. That is nice. Earlier many articles claimed that, in v8 javascript engine, a function with try/catch
block is not optimized. Now, async/await
requires try/catch
blocks to deal with errors. So, as a developer what needs to be done to keep same the performance?
2 Answers
Reset to default 13try/catch
received TurboFan optimizations in commit 9aac80f
for V8 5.3
(Node v7.x
and above). This means that the historic statement that try/catch
has bad performance is no longer true.
From V8 blog post:
In the past V8’s had difficulties optimizing the kind of language features that are found in ES2015+. For example, it never became feasible to add exception handling (i.e.
try/catch/finally
) support to Crankshaft, V8’s classic optimizing compiler. This meant V8’s ability to optimize an ES6 feature likefor...of
, which essentially has an implicit finally clause, was limited. Crankshaft’s limitations and the overall complexity of adding new language features to full-codegen, V8’s baseline compiler, made it inherently difficult to ensure new ES features were added and optimized in V8 as quickly as they were standardized.Fortunately, Ignition and TurboFan (V8’s new interpreter and compiler pipeline), were designed to support the entire JavaScript language from the beginning, including advanced control flow, exception handling, and most recently
for...of
and destructuring from ES2015. The tight integration of the architecture of Ignition and TurboFan make it possible to quickly add new features and to optimize them fast and incrementally.
try/catch
in an async
function is just syntatic sugar over a Promise .then
and .catch
methods, and performance is therefore determined by the underlying Promise implementation. Bluebird claims to have better performance than native Promise implementations, so theoretically - if what Bluebird claims is true - you'll achieve better try/catch
performance by overriding the native Promise implementation with Bluebird's Promise implementation.
For example, in Node: const Promise = require("bluebird")
, or global.Promise = require("bluebird")
to override it globally.
Note however that this might change in the future, as the original Promise implementation was in JavaScript, but has recently been re-implemented in C++ as can be tracked in bug #5343.
I found a Performance of native ES2015 promises and ES2017 async functions in Node.js v8
Performance of Callbacks vs Promises vs Async Functions in Node.js v8
Both native Chrome V8 ES2015 promises and ES2017 async functions perform roughly 2 times slower than Bluebird promises using almost 2 times more memory
and
Conclusion
Node.js v8 comes with significantly improved performance of native ES2015 promises and ES2017 async functions, further boosted by the introduction of native util.promisify.
.catch()
? – guest271314 Commented Sep 29, 2017 at 4:37.catch()
atasync/await
are you referencing?(async() => { "use strict"; await abc })() .then(result => console.log("resolved:", result)) .catch(err => console.error("rejected:", err))
– guest271314 Commented Sep 29, 2017 at 6:42await
statements are used, you have to usetry/catch
. If you do not understand that, then please go read aboutawait
and rejections. I'm not going to educate you about that in the comments here. This is analogous to a.catch()
used at the end promise chain, but when using multipleawait
statements instead of a promise chain, one cannot only use.catch()
to catch the rejection at the higher level. – jfriend00 Commented Sep 29, 2017 at 6:47