gpt4 book ai didi

javascript - 为什么封装的 Javascript 函数会有如此巨大的性能差异?

转载 作者:行者123 更新时间:2023-12-03 03:26:14 25 4
gpt4 key购买 nike

所以我有这个简单的代码:

function Run () {
var n = 2*1e7;
var inside = 0;
while (n--) {
if (Math.pow(Math.random(), 2) +
Math.pow(Math.random(), 2) < 1)
inside++;
}

return inside;
}

var start = Date.now();
Run();
console.log(Date.now() - start);

它会输出大约335ms的时间。那很好。但是,如果我像这样封装 Run 函数:

var d = Date.now();
(function Run () {
var n = 2*1e7;
var inside = 0;
while (n--) {
if (Math.pow(Math.random(), 2) +
Math.pow(Math.random(), 2) < 1)
inside++;
}

return inside;
})();
console.log(Date.now() - d);

它将输出18319ms,这比之前的情况差很多。这是为什么?

另外,如果重要的话,我在 Chrome 26.0.1410.63 上的控制台中运行它。在 Node.js 上,这两个代码段在控制台上都表现良好。

最佳答案

对于优化来说,函数减速和函数表达式没有区别,这太荒谬了。

<小时/>

Google Chrome 中的控制台代码包装在 with 语句中,如下所示:

 with ((console && console._commandLineAPI) || {}) {
//Your code is concatenated here
}

因为函数声明被提升,所以前面的代码实际上是这样的:

function Run () {
var n = 2*1e7;
var inside = 0;
while (n--) {
if (Math.pow(Math.random(), 2) +
Math.pow(Math.random(), 2) < 1)
inside++;
}

return inside;
}

with ((console && console._commandLineAPI) || {}) {
var start = Date.now();
Run();
console.log(Date.now() - start);
}

因此声明是在 外部 with 语句运行的。事实上,在 block 中声明函数不是有效的语法,function declaration can only be a top level statement .

所以无论如何,由于历史原因,V8 很好并且将其提升出来而不是抛出语法错误:

var i = 3;

with({i:4}) {
function test() {
console.log(i);
}
}
test();//logs 3 so it is obviously **not** under `with` influence

因此,由于声明不在 with 语句下,因此运行速度会快得多。 With 语句在 V8 下不可优化*,并且还会破坏词法作用域。

<小时/>

*不可优化意味着优化编译器不会查看代码,而只有通用编译器将为该函数生成代码。它类似于 Firefox 的解释器 vs JIT 模式。如果您想了解有关 V8 中哪些语言功能禁用优化的更多信息,请阅读 optimization killers

关于javascript - 为什么封装的 Javascript 函数会有如此巨大的性能差异?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20354779/

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