gpt4 book ai didi

javascript - JS : Assigning a variable in the parent scope of a closure costs performance. 为什么?

转载 作者:行者123 更新时间:2023-11-29 10:08:42 25 4
gpt4 key购买 nike

在研究 javascript 中的闭包时,我想出了下面的小例子,但我并不真正理解发生了什么。

我希望使用垃圾收集器,假设在紧密循环中的函数内使用 var 声明变量会导致大量分配和释放。我试图通过将我的 var 声明放在闭包的父范围内来避免这种情况,并期望闭包函数会更快。不管这个想法一开始可能有多糟糕,我偶然发现了这个小问题。

var withClosure = function() {
var a, b, c, d, e, f, g;
return function () {
a = 1;
b = 2;
c = 3;
d = 4;
e = 5;
f = 6;
g = 7;
};
}();

var withoutClosure = function () {
var a = 1;
var b = 2;
var c = 3;
var d = 4;
var e = 5;
var f = 6;
var g = 7;
};

console.time("without");
for (var i = 0; i < 1000000000; i++) {
withoutClosure();
}
console.timeEnd("without");


console.time("withcsr");
for (var i = 0; i < 1000000000; i++) {
withClosure();
}
console.timeEnd("withcsr");


/*
Output on my machine:
without: 1098.329ms
withcsr: 8878.812ms

Tested with node v.6.0.0 and Chrome 50.0.2661.102 (64-bit)
*/

我在父作用域中赋值给变量的事实使得闭包运行速度比我机器上的正常版本慢 8 倍。使用更多变量会使情况变得更糟。如果我只是读取变量而不是分配给它们,那么问题就不存在了。

这是什么原因造成的?谁能解释一下?

最佳答案

在没有闭包的示例中,任何体面的 Javascript 引擎都会意识到函数中的变量已初始化但在超出范围之前从未被读取,因此可以在不影响函数输出的情况下将其删除。

在带有闭包的示例中,变量保留在范围内,因此无法优化。

此演讲深入解释了 JIT Javascript 编译器进行的一些优化:https://www.youtube.com/watch?v=65-RbBwZQdU

关于javascript - JS : Assigning a variable in the parent scope of a closure costs performance. 为什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37942790/

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