3

首先我运行它(在 chrome 中):

var start;
var end;

start = (new Date()).getTime();

for(var i=0;i<10e5;i++);

end = (new Date()).getTime();

console.log('delay:' + (end-start));

输出: 然后我运行这个:delay:2028

function foo() {
    var start;
    var end;

    start = (new Date()).getTime();

    for(var i=0;i<10e5;i++);

    end = (new Date()).getTime();

    console.log('delay:' + (end-start));
}

foo();

输出:delay:8

为什么将相同的代码包装在函数中时花费的时间更短?

在节点中它花费了相同的时间(6和6),但是节点使用chrome的V8引擎不是吗?

4

2 回答 2

3

因为在函数中你所有的变量都在闭包中。没有函数 JavaScript 解释器首先尝试在全局范围内查找您的变量。

于 2012-06-22T12:34:32.010 回答
2

我认为这种行为只出现在控制台中的事实非常有说服力。我怀疑这与 V8 引擎如何将脚本缩减为原生代码有关。

第 1 点:我怀疑范围不是放缓的原因:

function foo() {
    start = (new Date()).getTime();
    for(i=0;i<10e5;i++);
    end = (new Date()).getTime();
    console.log('delay:' + (end-start));
}

此代码在全局范围内使用startend和。i如果在全局范围内搜索确实是瓶颈,那么这段代码也应该运行缓慢,因为它在函数中没有局部变量。

第 2 点:如果您将代码放在实际网页中,无论哪种方式,它都会运行得非常快。这向我表明,在控制台中运行代码是减速的根源。

通常,在网页上,V8 引擎将 JavaScript 组装成原生二进制代码,因此运行速度非常快。但是,我怀疑从控制台运行的代码没有编译(或者可能在运行时逐行编译,这本身会产生时间成本)。但是,当输入函数定义时,函数会在第一次运行之前完整编译。当程序流到达foo()调用时,该函数foo已经编译为本机代码。因此该函数运行很快,因为它已经被预编译,但是控制台中的原始代码没有被预编译,所以它运行很慢。

这在很大程度上是猜测,但对这个问题的每个答案也是如此。这是我能想到的唯一解释,它解释了上面的第 1 点和第 2 点。

于 2012-06-22T15:24:34.967 回答