了解JavaScript性能差异

ben*_*ben 7 javascript performance

http://jsfiddle.net/6L2pJ/

var test = function () {
    var i,
        a,
        startTime;

    startTime = new Date().getTime();

    for (i = 0; i < 3000000000; i = i + 1) {
        a = i % 5;   
    }
    console.log(a); //prevent dead code eliminiation
    return new Date().getTime() - startTime;
};

var results = [];

for (var i = 0; i < 5; i = i + 1) {
    results.push(test());
}

for (var i = 0; i < results.length; i = i + 1) {
    console.log('Time needed: ' + results[i] + 'ms');
}
Run Code Online (Sandbox Code Playgroud)

结果是:

首次执行:

Time needed: 13654ms 
Time needed: 32192ms 
Time needed: 33167ms 
Time needed: 33587ms 
Time needed: 33630ms 
Run Code Online (Sandbox Code Playgroud)

第二次执行:

Time needed: 14004ms 
Time needed: 32965ms 
Time needed: 33705ms 
Time needed: 33923ms 
Time needed: 33727ms 
Run Code Online (Sandbox Code Playgroud)

第三次执行:

Time needed: 13124ms 
Time needed: 30706ms 
Time needed: 31555ms
Time needed: 32275ms
Time needed: 32752ms 
Run Code Online (Sandbox Code Playgroud)

从第一排跳到第二排的原因是什么?

我的设置:

  • Ubuntu 13.10

  • 谷歌浏览器36.0.1985.125(Mozilla Firefox 30.0提供相同类型的结果)

编辑:

我修改了代码,在语义上保持相同但内联所有内容.有趣的是,它不仅显着加快了执行速度,而且还在很大程度上消除了我上面描述的现象.尽管如此,轻微的跳跃仍然是显而易见的.

修改后的代码

http://jsfiddle.net/cay69/

结果:

首次执行:

Time needed: 13786ms 
Time needed: 14402ms 
Time needed: 14261ms 
Time needed: 14355ms 
Time needed: 14444ms 
Run Code Online (Sandbox Code Playgroud)

第二次执行:

Time needed: 13778ms 
Time needed: 14293ms 
Time needed: 14236ms
Time needed: 14459ms 
Time needed: 14728ms 
Run Code Online (Sandbox Code Playgroud)

第三次执行:

Time needed: 13639ms 
Time needed: 14375ms 
Time needed: 13824ms 
Time needed: 14125ms 
Time needed: 14081ms
Run Code Online (Sandbox Code Playgroud)

Iva*_*van 0

看来 Google Chrome 正在将您的脚本执行分解为多个块,并为其他进程提供处理时间。直到每次函数调用的执行时间达到 600 毫秒左右时,它才会被注意到。我使用较小的数据子集进行了测试(如果我没记错的话,为 300000000。)

  • 你从哪里获取 600 毫秒? (2认同)