Node.jsアプリケーションのプロファイリングに興味があります。 --prof
フラグで開始し、v8.log
ファイルを取得しました。私はwindows-tick-processorを使用して、人間が読めると思われるプロファイリングログを取得しました。質問の下部には、ログファイルからのいくつかの小さな抜粋がありますが、私は完全に理解できていません。
ティック統計的アプローチを取得します。 total
とnonlib
の意味がわかりません。また、一部のものの前にLazyCompile
、Function
、Stub
などの用語が付いている理由もわかりません。
私が望むことができる最善の答えは、すべての用語、構造などを完全に説明する、ティックプロセッサ出力形式の完全なドキュメント/ガイドです...
それを除けば、私はレイジーコンパイルが何であるかを理解していません。コンパイルですか?すべての関数が1回だけコンパイルされるのではありませんか?では、コンパイルはどのようにしてアプリケーション実行の重要な部分になるのでしょうか。アプリケーションはこのログを生成するために何時間も実行され、内部JavaScriptコンパイルにはミリ秒かかると想定しています。これは、レイジーコンパイルが関数ごとに1回は発生しないが、ある種のコード評価中に発生することを示唆していますか?これは、関数定義(ネストされた関数など)があるところならどこでも、内部関数が毎回「レイジーコンパイル」されることを意味しますか?
私はこれに関する情報をどこにも見つけることができませんでした、そして私は何日もグーグルしてきました...
また、プロファイラーフラグがたくさんあることもわかりました。それらに関する追加の参照も歓迎します。
[JavaScript]: 非ライブラリ名の合計をチェック 88414 7.9%20.1%LazyCompile:* getUniqueId C:\ n\dev\SCNA\infra\lib\node-js\utils\general-utils.js:16 22797 2.0%5.2%LazyCompile:* keys native v8natives.js:333 14524 1.3%3.3%LazyCompile:Socket._flush C:\ n\dev\SCNA\runtime-environment\load-generator\node_modules\zmq\lib\index.js:365 12896 1.2%2.9%LazyCompile:BasicSerializeObject native json.js:244 12346 1.1%2.8% LazyCompile:BasicJSONSerializeネイティブjson.js:274 9327 0.8%2.1%LazyCompile:* C:\ n\dev\SCNA\runtime-environment\load-generator\node_modules\zmq\lib\index.js:194 7606 0.7%1.7%LazyCompile:* parse native json.js:55 5937 0.5%1.4%LazyCompile:* split native string.js:554 5138 0.5%1.2% LazyCompile:* Socket.send C:\ n\dev\SCNA\runtime-environment\load-generator\node_modules\zmq\lib\index.js:346 4862 0.4% 1.1%LazyCompile:*ソートネイティブarray.js:741 4806 0.4%1.1%LazyCompile:_。each ._。forEachC:\ n\dev\SCNA\infra\node_modules\underscore\underscore.js: 76 4481 0.4%1.0%LazyCompile:〜_.each ._。forEachC:\ n\dev\SCNA\infra\node_modules\underscore\underscore.js:76 4296 0.4%1.0 %LazyCompile:stringify native json.js:308 3796 0.3%0.9%LazyCompile:〜b native v8natives.js:1582 3694 0.3%0.8%Function:〜recursivePropertiesCollector C:\ n\dev\SCNA\infra\lib\node-js\utils\object-utils.js:90 3599 0.3%0.8%LazyCompile:* BasicSerializeArray native json.js:181 3578 0.3%0.8% LazyCompile:* Buffer.write buffer.js:315 3157 0.3%0.7%スタブ:CEntryStub 2958 0.3%0.7%LazyCompile:promise.promiseDispatch C:\ n\dev\SCNA\runtime- environment\load-generator\node_modules\q\q.js:516
88414 7.9%LazyCompile:* getUniqueId C:\ n\dev\SCNA\infra\lib\node-js\utils\general-utils.js:16 88404 100.0 %LazyCompile:* generateId C:\ n\dev\SCNA\infra\lib\node-js\utils\general-utils.js:51 88404 100.0%LazyCompile:* register C:\ n\dev\SCNA\fra\lib\node-js\events\pattern-dispatcher.js:72 52703 59.6%LazyCompile:* C:\ n\dev\SCNA\runtime-environment\load-generator\lib\vuser -driver\mdrv-driver.js:216 52625 99.9%LazyCompile:* _。each ._。forEachC:\ n\dev\SCNA\runtime-environment\load-generator\node_modules\underscore\underscore .js:76 52625 100.0%LazyCompile:〜usingEventHandlerMapping C:\ n\dev\SCNA\runtime-environment\load-generator\lib\vuser-driver\mdrv-driver.js:214 35555 40.2%LazyCompile:*一度C:\ n\dev\SCNA\infra\lib\node-js\events\pattern-dispatcher.js:88 29335 82.5%LazyCompile:〜startAction C:\ n\dev\SCNA\runtime-environment\load-generator\lib\vuser-driver\mdrv-driver.js:201 25687 87.6%LazyCompile:〜onActionComplete C:\ n\dev\SCNA\runtime-environment\load-generator\lib\vuser-driver\mdrv- logic.js:130 1908 6.5%LazyCompile:〜b native v8natives.js:1582 1667 5.7%LazyCompile:_fulfilled C:\ n\dev\SCNA\runtime-environment\load-generator\node_modules\q\q.js:795 4645 13.1%LazyCompile:〜terminate C:\ n\dev\SCNA\runtime-environment\load-generator\lib\vuser-driver\mdrv-driver.js :160 4645 100.0%LazyCompile:〜terminate C:\ n\dev\SCNA\runtime-environment\load-generator\lib\vuser-driver\mdrv-logic.js:171 1047 2.9%LazyCompile:* startAction C:\ n\dev\SCNA\runtime-environment\load-generator\lib\vuser-driver\mdrv-driver.js:201 1042 99.5%LazyCompile:〜onActionComplete C:\n\dev\SCNA\runtime-environment\load-generator\lib\vuser-driver\mdrv-logic.js:130
確かに、コードのコンパイルに実際に費やされた時間についてのあなたの仮定は正しいです:それはミリ秒かかります(これは--trace-opt
フラグで見ることができます)。
今そのLazyCompile
について話します。これはVyacheslavEgorov(以前のv8 dev)からの引用です blog :
V8のティックプロセッサを使用している場合は、LazyCompile:プレフィックスがnotであるということは、この時間がコンパイラで費やされたことを意味するのではなく、関数自体を意味することに注意してください。怠惰にコンパイルされました。
関数名の前のアスタリスクは、最適化されていない関数tildaに時間が費やされていることを意味します。
関数がコンパイルされる回数についての質問について。実際、JIT(いわゆるフルコードゲン)は、初めて実行されるときに、各関数の最適化されていないバージョンを作成します。しかし、後で任意の(まあ、ある程度)数または再コンパイルが発生する可能性があります(最適化と救済のため)。ただし、この種のプロファイリングログには表示されません。
私の理解の限りでは、Stub
プレフィックスは、実行がランタイムの一部であり、エンジンの他の部分と一緒にコンパイルされるC-Stub内で行われたことを意味します(つまり、JITでコンパイルされたJSコードではありません) 。
total
vs. nonlib
:
これらの列は、合計/非lib時間のx%がそこで費やされたことを意味します。 (私はあなたに議論を紹介することができます ここ )。
また、 https://github.com/v8/v8/wiki/Using%20V8%E2%80%99s%20internal%20profiler 便利です。