我怎样才能避免"优化远离"我的javascript测试用例?

时间:2016-03-22 16:19:04

标签: javascript benchmarking

我有jsperf test case,结果非常令人困惑。我有三个"摘要":

  • 乘法
  • 控制(两种操作均未完成)
大多数时候,他们都以相同的速度出现......甚至控制!我猜想JS JIT编译器是removing my "unnecessary" instructions,当它们似乎没有任何效果时;所以当测试循环完成时我开始accumulating the results, and logging them to the console,例如

for (var i = 0; i < nNumbers; i++) {
  result += a[i] / b[i];
}
console.log(result);

然而,当控制台从没有开启时,我得到了截然不同的结果。控制台日志记录的减速似乎压倒了任何其他性能问题。

所以我试着在每个&#34;片段中加快迭代次数,&#34;最小化相对于我尝试测试的操作的日志记录量。但我仍然没有在三个片段之间产生明显的速度差异。实际上,除法和乘法都与评估常数?我一定做错了什么。或者jsperf坏了。

已经回答了相关问题,但我发现没有任何特定于Javascript基准测试的问题。

1 个答案:

答案 0 :(得分:1)

请勿将console.log放入您的定时部分。在与您实际想要测量的操作进行比较时,速度非常慢,因此会使您的结果出现偏差。另外 - 正如您所注意到的那样 - 控制台打开时的时间会有所不同。

您可以将结果放在全局数组中来防止deoptimisations。优化器只能remove code不影响结果,如果它操纵全局状态则不可能。

当然,这仍然不一定会阻止loop-invariant code motion,因此您还需要确保定时代码始终对不同的数据进行操作。