JavaScript:相同的代码需要不同的时间来执行

时间:2012-06-22 12:30:53

标签: javascript google-chrome execute

首先我运行它(在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),但是节点使用的是V8引擎,不是吗?

2 个答案:

答案 0 :(得分:3)

因为在函数中所有变量都在闭包中。没有函数JavaScript解释器首先尝试在Global scope中查找变量。

答案 1 :(得分:2)

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

第1点:我怀疑范围是导致经济放缓的原因:

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

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

第2点:如果您将代码放在实际的网页中,它会以任何一种方式快速运行。这告诉我,在控制台中运行代码是减速的来源。

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

这主要是猜测,但这个问题的答案也是如此。这是我可以设计的唯一解释,即上述#1和#2点。