web-dev-qa-db-ja.com

Node.jsの「CrankShaftScript」とは何ですか?

Node.jsコミュニティには、Twitter、GitHub、およびFacebookのグループディスカッションで「CrankShaftScript」(および「CrankShaftJS」)への参照がますます増えています。 Node.jsはC++とJavaScriptで記述されていると思ったので、CrankShaftScriptは次のようなパフォーマンス回帰のバグで何を参照していますか。

https://github.com/nodejs/CTC/issues/146#issue-237435588

24
Matt Hargett

CrankShaftScriptは、CrankShaftJITコンパイラを採用するv8JavaScriptランタイムの特定のバージョンでのみ実行および/または適切に実行される、非慣用的および/または非標準準拠のJavaScriptに使用されるコミュニティで採用された用語です。具体的な例としては、v8でのJIT最適化の欠陥を回避するために保守が困難な方法で記述されたループ、v8固有の組み込み関数/グローバルの使用などがあります。

この用語は元々、v8の代わりにChakraCoreおよびSpiderMonkeyランタイムを使用するNode.jsディストリビューションであるnode-chakracoreおよびspidernodeのいくつかのルートパフォーマンスの問題を説明するために造られました。

現在、v8の新しいバージョンに更新されたNode.js 8.1リリースシリーズで、v8のCrankShaft JITがTurboFan(時々参照される)に取って代わられたために、マイクロベンチマークとマクロベンチマークでいくつかのパフォーマンスの低下がある理由を説明するための省略形として使用されています。 「TF」として)。これらの問題のように:

これらの理由から、Node.jsコミュニティは、Node.jsコアコードおよび一般的なnpmパッケージでCrankShaftScriptのインスタンスの切り出しに積極的に取り組んでいます。これにより、node-chakracoreなどの代替Node.jsディストリビューションのパフォーマンスが向上し、Node.jsのJavaScriptランタイムへの将来のアップグレードのリスクが軽減されます。

16
Matt Hargett

CrankShaftScriptは、V8のCrankShaftエンジンでより高速に(最も)実行されるJSイディオム(特定のタイプのループなど)にコミュニティによって付けられた名前です。

CrankShaftは、TurboFanという名前のエンジンに置き換えられています。何年にもわたって開発者によって書かれた多くのJSコードは、CrankShaftで高速に実行される既知のイディオムを使用してCrankShaftで高速に実行するように特別に記述されています(たとえば、「CrankShaftScript」で記述されています)。異なり、CrankShaftで最速で実行されたコードは、TurboFanで最速で実行されるとは限りません。

私の答えが冗長すぎる場合のために、これが NodeJSベンチマーク スレッドの 素晴らしいコメント です。

... Nodeコアの一部がCrankshaftScriptで記述されていることに気付きました。つまり、Crankshaftで非常にうまく機能するものに注意深く調整されています。

23
Adam

CrankShaftは、Node.jsのJavascriptランタイム( details )であるV8のコンパイルインフラストラクチャです。

現在はTurboFanに置き換えられています です。

0
SLaks