我做了a jsPerf test,看看在JavaScript中的函数中使用参数或局部变量之间是否存在任何性能差异。
在Firefox 34中,几乎没有区别。但是,在Chrome 39中,编译器似乎造成了很大的伤害。看到这些结果:
有人可以解释为什么会这样吗?
答案 0 :(得分:4)
首先,对于试图测量参数与局部变量性能行为的基准测试,你在每种情况下都做太多 - 你一次又一次地分配一个闭包,你从对象中分配对象文字,你使用for-in循环。所有这些操作都比本地变量访问更昂贵更多。它们的成本包含并隐藏了任何小的成本变量访问。
现在您看到的异常是由于V8没有快速路径来创建包含文字的闭包:有FastNewClosureStub
但它仅在闭包[1]中没有文字时使用。这使得闭包分配在第一种情况下比第二种情况更昂贵 - 您看到这反映在得分中,因为闭包分配是您的基准的主要部分(它为每个 op 分配一个闭包)。 / p>
如果你"隐藏"文字创作[2]成为一个单独的函数,你会看到异常消失。注意:这样的隐藏不再使基准具有代表性:它仍然不衡量你想要衡量的东西。
总体上尝试捕获基准测试中的变量访问的性能特征是非常困难的,因为即使在非优化(基线)编译器生成的代码中,这些操作通常也是最快和最小的操作之一。在最常见的情况下,当没有捕获变量且范围不包含with
,eval
或arguments
对象时 - 参数和局部变量访问都没有区别编译成单个内存负载。
[2] http://jsperf.com/variable-vs-variable-passed-as-an-argument-to-a-self-in/3