最新消息:雨落星辰是一个专注网站SEO优化、网站SEO诊断、搜索引擎研究、网络营销推广、网站策划运营及站长类的自媒体原创博客

javascript - Performance guidelines for AsyncAwait in Node Version 8 - Stack Overflow

programmeradmin1浏览0评论

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?

Share Improve this question asked Sep 29, 2017 at 4:13 explorerexplorer 9528 silver badges21 bronze badges 5
  • Have you tried using .catch()? – guest271314 Commented Sep 29, 2017 at 4:37
  • @jfriend00 What specific pattern using .catch() at async/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:42
  • @jfriend00 No, do not gather which specific pattern you are referencing. – guest271314 Commented Sep 29, 2017 at 6:45
  • 1 @guest271314 - Please stay on topic here based on the question. To catch a rejection at a higher level that occurs in a block where multiple await statements are used, you have to use try/catch. If you do not understand that, then please go read about await 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 multiple await 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
  • 1 I don't think you need to use try/catch, if you initiate with something like this: 'userService.logIn(req, res) .then(result => res.json(result)) .catch(error => next(error));' , every rejection / throw down the line (if not caught there) will be handled here. – PVermeer Commented Apr 26, 2018 at 9:41
Add a comment  | 

2 Answers 2

Reset to default 13

try/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 like for...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.

发布评论

评论列表(0)

  1. 暂无评论