Chrome 39 JavaScript性能异常

时间:2015-01-05 16:06:19

标签: javascript google-chrome v8

我做了a jsPerf test,看看在JavaScript中的函数中使用参数或局部变量之间是否存在任何性能差异。

在Firefox 34中,几乎没有区别。但是,在Chrome 39中,编译器似乎造成了很大的伤害。看到这些结果:

有人可以解释为什么会这样吗?

1 个答案:

答案 0 :(得分:4)

首先,对于试图测量参数与局部变量性能行为的基准测试,你在每种情况下都做太多 - 你一次又一次地分配一个闭包,你从对象中分配对象文字,你使用for-in循环。所有这些操作都比本地变量访问更昂贵更多。它们的成本包含并隐藏了任何小的成本变量访问。

现在您看到的异常是由于V8没有快速路径来创建包含文字的闭包:有FastNewClosureStub但它仅在闭包[1]中没有文字时使用。这使得闭包分配在第一种情况下比第二种情况更昂贵 - 您看到这反映在得分中,因为闭包分配是您的基准的主要部分(它为每个 op 分配一个闭包)。 / p>

如果你"隐藏"文字创作[2]成为一个单独的函数,你会看到异常消失。注意:这样的隐藏不再使基准具有代表性:它仍然衡量你想要衡量的东西。

总体上尝试捕获基准测试中的变量访问的性能特征是非常困难的,因为即使在非优化(基线)编译器生成的代码中,这些操作通常也是最快和最小的操作之一。在最常见的情况下,当没有捕获变量且范围不包含withevalarguments对象时 - 参数和局部变量访问都没有区别编译成单个内存负载。

[1] https://github.com/v8/v8-git-mirror/blob/9def087efcd844342c35f42628bac4ead49cac81/src/ia32/full-codegen-ia32.cc#L1213-L1218

[2] http://jsperf.com/variable-vs-variable-passed-as-an-argument-to-a-self-in/3