Chrome39JavaScript性能异常

Chrome39JavaScript性能异常,javascript,google-chrome,v8,Javascript,Google Chrome,V8,我确实想看看在JavaScript中的函数中使用参数或局部变量是否有任何性能差异 在Firefox34中,几乎没有区别。然而,在Chrome39中,编译器似乎造成了很大的危害。请参见以下结果: 有人能解释为什么会发生这种情况吗?首先,对于一个试图测量参数与局部变量性能行为的基准,您在每种情况下都做得太多了-您一次又一次地分配闭包,您从对象文字分配对象,您用于循环中。所有这些操作都比局部变量访问要昂贵得多。他们的成本包含并隐藏了任何小的成本变量访问 现在,您看到的异常是由于V8没有创建包含文本的

我确实想看看在JavaScript中的函数中使用参数或局部变量是否有任何性能差异

在Firefox34中,几乎没有区别。然而,在Chrome39中,编译器似乎造成了很大的危害。请参见以下结果:


有人能解释为什么会发生这种情况吗?

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

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

如果将文字创建[2]隐藏到单独的函数中,您将看到异常消失。注意:这种隐藏不再使基准测试具有代表性:它仍然是而不是度量您想要度量的内容

总的来说,在基准测试中捕获变量访问的性能特征非常困难,因为即使在非优化(基线)编译器生成的代码中,这些操作通常也是最快和最小的操作之一。在最常见的情况下,如果没有捕获变量,并且作用域不包含
with
eval
参数
对象,则参数和局部变量访问之间不会有任何区别,这两种访问都会编译到单个内存负载中

[1]


[2]

为了记录在案,IE 11中的结果相同。这非常有帮助。谢谢你的见解!