2017-09-29 47 views
8

async/awaitは、ノードバージョン8で使用できます。コードは、nodejsでは初めてネイティブに線形です。それはいいです。以前の多くの記事では、v8のjavascriptエンジンでは、try/catchブロックの関数が最適化されていないと主張していました。今、async/awaitは、エラーを処理するにはtry/catchブロックが必要です。だから、開発者は同じ性能を維持するために何をする必要がありますか?ノードバージョン8のAsync/Awaitのパフォーマンスガイドライン

+0

'.catch()'を使ってみましたか? – guest271314

+0

@ jfriend00 'async/await'で' .catch() 'を使っている特定のパターンを参照していますか? => { "厳密な使用"; await abc })() .then(結果=> console.log( "解決済み:"、結果)) .catch(err => console) error( "rejected:"、err)) ' – guest271314

+0

@ jfriend00いいえ、あなたが参照している特定のパターンを収集しないでください。 – guest271314

答えて

3

try/catchは、V8 5.3(ノードv7.x以上)のコミットでTurboFanの最適化を受けました。9aac80fつまり、try/catchのパフォーマンスが悪いという歴史的な記述はもはや真実ではありません。 V8 blog postから

過去V8のではES2015 +で発見された言語機能の種類を最適化する難しさを持っていました。たとえば、例外処理(すなわちtry/catch/finally)をV8の従来の最適化コンパイラであるCrankshaftに追加することは決して実現できませんでした。これは、基本的に暗黙のfinally節を持つfor...ofのようなES6機能を最適化するV8の能力が限定されていることを意味していました。クランクシャフトの限界とV8のベースラインコンパイラであるfull-codegenに新しい言語機能を追加する際の複雑さのため、V8で新しいES機能が標準化されたときに迅速に追加および最適化されることは本質的に困難でした。

IgnitionとTurboFan(V8の新しいインタープリタとコンパイラパイプライン)は、高度なコントロールフロー、例外処理、そして最近ではfor...of、ES2015からの構造解除など、JavaScript言語全体を最初からサポートするように設計されています。 IgnitionとTurboFanのアーキテクチャを緊密に統合することで、新しい機能をすばやく追加し、迅速かつ段階的に最適化することが可能になります。 async関数で


try/catchプロミス.then.catch方法に勝るだけ糖衣構文であり、性能は、従って、基礎となるプロミス実装によって決定されます。ブルーバードは、ネイティブプロミスの実装よりも優れたパフォーマンスを持つため、理論的には、ブルーバードの主張が真であれば、BluebirdのPromise実装でネイティブなPromiseの実装をオーバーライドすることで、より良い結果が得られます(try/catch)。
たとえば、ノード:const Promise = require("bluebird")、またはglobal.Promise = require("bluebird")をグローバルにオーバーライドします。

元のPromise実装はJavaScriptであったが、バグ#5343で追跡できるように、C++で最近再実装されているため、これは将来変更される可能性があります。

+0

TurboFanの最適化を受けるのはどういう意味ですか? – jfriend00

+0

@ jfriend00 TurboFanは、V8の最適化コンパイラの1つです。詳細はこちらをご覧ください:https://github.com/v8/v8/wiki/TurboFan – Svenskunganka

+0

はい、それは最適化の一種です。質問される質問は、nodejsバージョン8で 'async/await'を使って' try/catch'パフォーマンスを確認しています。これまでと比較して 'try/catch 'がどれだけ速く' '待っていますか?あるいは、 'async/await'を使わず、約束と' .catch() 'を使うだけのプログラミングと比較してみてください。それは実際にその質問に答える情報のようなものです。 – jfriend00

0

私は、ノードにおける非同期機能対約束対コールバックのPerformance of native ES2015 promises and ES2017 async functions in Node.js v8

パフォーマンスを発見しました。JS V8

両方ネイティブクロームV8 ES2015約束とES2017非同期関数は がブルーバード約束よりも約2倍遅いを実行ほぼ2 回より多くのメモリを使用して

結論

Node.js v8のネイティブパフォーマンスが大幅に向上しました ES2015はES2017の非同期機能を約束し、 ネイティブutil.promisifyの導入によってさらに強化されました。

+0

BluebirdはNode.JSですか?私はChrome V8がNodeのエンジンだと思った。私はここで混乱しています、あなたは明確にできるのですか? – Pac0

+0

@ Pac0 'Bluebird'は' Promise'のユーザーランド実装です –

+1

Bluebirdパッケージは、約束がネイティブで利用できなかった場合に非常に便利でした。しかし、彼らの約束の実装は完全に仕様に準拠していません。だからこそV8の実装はやや遅いです。実装は大幅に改善されており、BlueBirdとほぼ同等です。スペックコンプライアンス、追加の依存関係がなく、将来のエンジン最適化の恩恵を受けるので、私はネイティブの約束を使用します。 – user835611

関連する問題