【问题标题】:Dump v8 JIT output from node从节点转储 v8 JIT 输出
【发布时间】:2012-06-12 18:26:30
【问题描述】:

node.js(或其他 v8 接口或 v8 的包装器)能否从 v8 JIT 输出生成的程序集?

我想看看针对各种 sn-ps 生成的程序集是什么样的。

【问题讨论】:

  • 我试过这个,但它没有输出任何东西:node --expose-debug-as=d -e "function f(){return 1;}; d.Debug.disassemble(f)"
  • 您是否想调查某个特定的 sn-p?

标签: javascript node.js jit v8


【解决方案1】:

您需要确保在构建 node.js 时启用了 V8 反汇编程序。默认情况下,调试版本将启用它。对于发布版本(在最近的使用 GYP 版本的节点中),您可以通过以下方式启用它:

GYP_DEFINES="v8_enable_disassembler=1 v8_object_print=1" ./configure

并重建节点。

启用反汇编程序后,您可以使用 --print-code--print-code-stubs--print-opt-code--code-comments 等标志来检查 V8 生成的代码。

如果您想研究通过优化编译器使用的 IR,请使用 --trace-hydrogen 并查看 hydrogen.cfg(可以使用 C1 Visualizer 查看)。

【讨论】:

  • 此信息是否仍然是最新的?
  • @OleksiiRudenko 是的,主要是。为什么?如今,node 在发布和调试(github.com/nodejs/node/blob/master/common.gypi#L21)中都默认启用了反汇编程序。我还建议使用 IRHydra (mrale.ph/irhydra/2) 而不是 C1 Visualizer - 但除此之外所有标志都是相同的。
  • IRHydra 看起来真的很酷!谢谢,很高兴知道我现在不需要重新编译节点。我想知道 IRHydra 是否与 Benchmark.js 集成?我的意思是它可以从分析中排除不相关的 benchmark.js 代码吗?直接从基准测试中捕获编译工件是否真的有意义,或者创建隔离示例是否有意义?
  • @OleksiiRudenko 不,它不排除任何东西 - 它与您正在查看的代码无关,实际上很难确定什么是相关的,什么不是。第二个问题的答案取决于您正在查看的代码类型。在某些情况下,您需要孤立的示例,在某些情况下,(微)基准可以提供足够的数据 - 当您决定在如此低的级别上进行优化时,没有通用的答案。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2011-10-19
  • 1970-01-01
  • 2013-10-08
  • 2012-10-31
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多