【问题标题】:How do I measure CPU cache and prefetch misses in JavaScript engines?如何测量 JavaScript 引擎中的 CPU 缓存和预取未命中?
【发布时间】:2017-06-20 19:19:49
【问题描述】:

我想要一种命令行方式来评估低级别的贡献者,以降低 Node.js 应用程序的每瓦性能。即 JIT 生成的本机代码的 L1、L2 和预取缓存未命中,以及 JavaScript 运行时本身的 JIT/GC/interpteter。

JavaScriptCore、v8 和 ChakraCore 都提供用于运行基准测试的命令行 REPL。我可以在基于 Intel、AMD 和 ARMv6 的硬件上运行哪些分析器来以合理的准确度收集这些统计信息?我希望有一种方法可以在至少两个操作系统上执行此操作:Windows、Mac 和/或 Linux。

【问题讨论】:

  • 我以前从未见过类似的东西,在大约 10 年的核心 js 开发中......
  • @dandavis 你实际上是一个中核 js 开发者。这是铁杆
  • 我看不出这是 JS 特有的。只需像使用任何其他程序一样配置 js 引擎。
  • 一些分析器无法为动态生成的本机代码提供准确的信息,只能提供具有特定符号的编译时代码。

标签: javascript v8 cpu-cache javascriptcore chakracore


【解决方案1】:

V8 和 Linux perf 工具相互支持,请参阅the documentation。如果您有一个非常新的系统(IIRC 内核 >= 4.4 和 perf >= 4.10),您可以跳过编译您自己的内核和perf 的步骤。

【讨论】:

  • 不幸的是,这不允许我评估 Linux、Windows 或 MacOS 实现之间的差异。根据线程模型、本机锁定机制等,JIT 和 GC 在平台之间的运行方式完全不同。
  • JIT 和 GC 与操作系统无关;每个平台提供的锁定/线程原语的细微差别都被抽象掉了。 Linuxperf 是 V8 团队用于低级分析的工具;如果存在任何更好/额外的解决方案,我们希望了解它:-)
  • 异常、蹦床、JIT 代码如何映射到内存页等,据我了解,在 MacOS、Windows 和 Linux 之间实际上是完全不同的。我误会了吗?
  • 是的,这听起来像是个误会。我不知道有任何显着差异。异常机制到处都是一样的。代码对象在任何地方都以相同的方式放入堆中。我不知道你在说什么蹦床。
【解决方案2】:

您可以使用Valgrind。引用他们的常见问题解答,“Valgrind 可以处理动态生成的代码,只要生成的代码以后不会被其他生成的代码覆盖”。

X86/Linux、X86/Darwin等各种平台也支持

【讨论】:

  • 由于 V8 将生成的代码放入垃圾回收堆,代码对象确实会四处移动,并且随着时间的推移,相同的内存地址很可能会用于不同的代码对象。
猜你喜欢
  • 2021-01-12
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-04-22
  • 1970-01-01
  • 2012-04-21
  • 1970-01-01
相关资源
最近更新 更多