メモ
node8.x系においてasync/awaitにといてtry/catchを使う場合のパフォーマンスに関する議論 stackoverflow.com
ざっくりいうと
V8の最新版においては、optimizer compilerであるturbofanによってtry catchの処理の最適化がされているため、V8(5.3以下 ) に比べて try/catchのパフォーマンスが向上している
V8 5.3時点(node.jsでいうと7.x系)でのtry catch周りの処理
https://github.com/v8/v8/blob/5.3-lkgr/src/ast/ast-numbering.cc#L306-L319
DisableCrankshaftによって、Crankshaftによる最適化が無効にされていることがわかる
void AstNumberingVisitor::VisitTryCatchStatement(TryCatchStatement* node) { IncrementNodeCount(); DisableCrankshaft(kTryCatchStatement); Visit(node->try_block()); Visit(node->catch_block()); } void AstNumberingVisitor::VisitTryFinallyStatement(TryFinallyStatement* node) { IncrementNodeCount(); DisableCrankshaft(kTryFinallyStatement); Visit(node->try_block()); Visit(node->finally_block()); }
V8 2017/11/23時点でのtry catch周りの処理
最適化の無効処理は消されていて、最適化が走っていると思われる(実際にどう最適化されているかまでは追えていない)
https://github.com/v8/v8/blob/master/src/ast/ast-numbering.cc#L193-L202
void AstNumberingVisitor::VisitTryCatchStatement(TryCatchStatement* node) { DCHECK(node->scope() == nullptr || !node->scope()->HasBeenRemoved()); Visit(node->try_block()); Visit(node->catch_block()); } void AstNumberingVisitor::VisitTryFinallyStatement(TryFinallyStatement* node) { Visit(node->try_block()); Visit(node->finally_block()); }