async/await
は、ノードバージョン8で使用できます。コードは、nodejsでは初めてネイティブに線形です。それはいいです。以前の多くの記事では、v8のjavascriptエンジンでは、try/catch
ブロックの関数が最適化されていないと主張していました。今、async/await
は、エラーを処理するにはtry/catch
ブロックが必要です。だから、開発者は同じ性能を維持するために何をする必要がありますか?ノードバージョン8のAsync/Awaitのパフォーマンスガイドライン
答えて
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++で最近再実装されているため、これは将来変更される可能性があります。
TurboFanの最適化を受けるのはどういう意味ですか? – jfriend00
@ jfriend00 TurboFanは、V8の最適化コンパイラの1つです。詳細はこちらをご覧ください:https://github.com/v8/v8/wiki/TurboFan – Svenskunganka
はい、それは最適化の一種です。質問される質問は、nodejsバージョン8で 'async/await'を使って' try/catch'パフォーマンスを確認しています。これまでと比較して 'try/catch 'がどれだけ速く' '待っていますか?あるいは、 'async/await'を使わず、約束と' .catch() 'を使うだけのプログラミングと比較してみてください。それは実際にその質問に答える情報のようなものです。 – jfriend00
私は、ノードにおける非同期機能対約束対コールバックの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の導入によってさらに強化されました。
BluebirdはNode.JSですか?私はChrome V8がNodeのエンジンだと思った。私はここで混乱しています、あなたは明確にできるのですか? – Pac0
@ Pac0 'Bluebird'は' Promise'のユーザーランド実装です –
Bluebirdパッケージは、約束がネイティブで利用できなかった場合に非常に便利でした。しかし、彼らの約束の実装は完全に仕様に準拠していません。だからこそV8の実装はやや遅いです。実装は大幅に改善されており、BlueBirdとほぼ同等です。スペックコンプライアンス、追加の依存関係がなく、将来のエンジン最適化の恩恵を受けるので、私はネイティブの約束を使用します。 – user835611
- 1. 一般的なGuiceのパフォーマンスガイドライン
- 2. 特定ノードバージョンのドッカー画像
- 3. GraphQLの最小必須ノードバージョン?
- 4. nvm uninstallは実際にノードバージョン
- 5. util.inspectは異なるノードバージョン
- 6. 角度4.0.0の有効なノードバージョン
- 7. 異なるノードバージョンのPublish/Target npmパッケージ
- 8. 永遠に:2つのノードバージョンをインストールして、実行するノードバージョンを指定してください
- 9. 現在のログイン用のNvm永続ノードバージョンubuntuセッション
- 10. ノード複数のノードバージョンのバインディングがありません
- 11. 古くなったノードバージョンのマシンでのEmberJS開発
- 12. メロアップデートはヒロクのノードバージョンをアップデートしていません
- 13. AWS OpsWorksでインスタンスのノードバージョンをアップグレードする方法
- 14. Appcelerator Studioはノードバージョンで動作していますか> 0.12
- 15. Hyperledger Fabricがノードバージョン7をサポートしていないのはなぜですか?
- 16. のJava 8:Javaの8月
- 17. 、8の意味は8? MIPS
- 18. Java 8 | HashMapのパラレルストリームのJava 8で
- 19. のJava 8のJava 8で条件
- 20. 複数のノードバージョンと複数のプロジェクトをNVMでどのように扱いますか?
- 21. Tomcat 8 Java 8のHttpServletRequest.getRemoteAddr()が空です
- 22. Windows Phone 8とのシリアル通信8
- 23. Windows Phone 8のGoogleマップAPI 8
- 24. Alternativa3d 8のマウスドラッグ?
- 25. Windows 8のストレージファイル
- 26. iOS 8のptrace
- 27. Xcode 8のアダプティブレイアウト
- 28. XcodeのUsageDescription 8
- 29. Java 8のカバレッジレポート
- 30. Xcodeの8 PRODUCT_BUNDLE_IDENTIFIER
'.catch()'を使ってみましたか? – guest271314
@ jfriend00 'async/await'で' .catch() 'を使っている特定のパターンを参照していますか? => { "厳密な使用"; await abc })() .then(結果=> console.log( "解決済み:"、結果)) .catch(err => console) error( "rejected:"、err)) ' – guest271314
@ jfriend00いいえ、あなたが参照している特定のパターンを収集しないでください。 – guest271314