如何读取nodejs内部分析器的tick-processor输出

我有兴趣分析我的Node.js应用程序。 我用--prof标志启动了它,并获得了一个v8.log文件。 我已经采取了windows-tick处理器,并获得了一个据说是人类可读的分析日志。 在这个问题的底部是一些从日志文件中摘录的小节,我完全不理解。

我得到了蜱统计方法。 我不明白total vs vs nonlib是什么意思。 另外我不明白为什么有些事情是以LazyCompileFunctionStub或其他术语为前缀的。

我希望得到的最好的答案是刻度处理器输出格式的完整文档/指南,完整地解释每个术语,结构等。

除此之外,我只是不明白懒惰编译是什么。 它是编译? 不是每个函数都只能编译一次吗? 那么编译怎么可能成为我的应用程序执行的重要部分呢? 该应用程序运行几个小时来生成这个日志,我假设内部的JavaScript编译需要几毫秒。 这表明懒编译是每个函数都不会发生的事情,而是在某种代码评估过程中发生的。 这是否意味着无处不在我有一个函数定义(例如一个嵌套的函数),内部函数每次都得到“懒编译”?

我无法在任何地方find任何信息,我一直在Google上search…

另外我知道有很多探查器标志。 关于这些的其他参考也是受欢迎的。

 [JavaScript的]:
   滴答总nonlib名字
   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:*键本机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 native 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:*parsing本机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:*sortingnative array.js:741
    4806 0.4%1.1%LazyCompile:_each ._ forEach C:\ n \ dev \ SCNA \ infra \ node_modules \ underscore \ underscore.js:76
    4481 0.4%1.0%LazyCompile:〜_each ._ forEach C:\ 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:*注册C:\ n \ dev \ SCNA \ infra \ 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 ._ forEach C:\ 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:〜终止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 。 以下是来自Vyacheslav Egorov(前v8 dev) 博客的引用:

如果你使用的是V8的tick处理器,记住LazyCompile:前缀并不意味着这一次花在编译器上,而只是意味着这个函数本身是懒惰地编译的。

函数名称前面的星号表示时间正在优化函数中使用,tilda – 未优化。

关于一个函数被编译多less次的问题。 实际上,JIT(所谓的full-codegen)在第一次执行时会为每个函数创build一个非优化版本。 但稍后可能会发生一些随意的(很好,某种程度上)或重新编译(由于优化和纾困)。 但是在这种分析日志中你不会看到任何东西。

根据我的理解, Stub前缀意味着执行是在C-Stub内部的,它是运行时的一部分,并与引擎的其他部分(即不是JIT编译的JS代码)一起编译。

totalnonlib

这些列仅仅意味着总共/非lib时间的x%花费在那里。 (我可以参考你在这里的讨论)。

另外,你可以findhttps://github.com/v8/v8/wiki/Using%20V8%E2%80%99s%20internal%20profiler有用。