gpt4 book ai didi

javascript - Chrome 39 JavaScript 性能异常

转载 作者:塔克拉玛干 更新时间:2023-11-02 20:45:47 25 4
gpt4 key购买 nike

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

在 Firefox 34 中,几乎没有区别。然而,在 Chrome 39 中,编译器似乎做了很多坏事。查看这些结果:

谁能解释为什么会这样?

最佳答案

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

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

如果您将文字创建[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

关于javascript - Chrome 39 JavaScript 性能异常,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27783298/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com