而x为javascript

时间:2015-02-23 13:30:57

标签: javascript node.js performance loops

我正在为javascript测试循环for and while并得到了这种情况:

function loopWithWhileOneBillion() {
    var max = 1000000000; //1kkk
    var date1 = new Date();
    var inc = 0;
    while (max--) {
        inc++;
    }
    var date2 = new Date();
    return date2.getTime() - date1.getTime();
}

function loopWithForOneBillion() {
    var max = 1000000000; //1kkk
    var date1 = new Date();
    var inc = 0;
    for (var i = 0; i < max; i++) {
        inc++;
    }
    var date2 = new Date();
    return date2.getTime() - date1.getTime();
}
/* *************************************** */

/* loop with 10kkk interactions */
function loopWithWhileTenBillion() {
    var max = 10000000000; //10kkk
    var date1 = new Date();
    var inc = 0;
    while (max--) {
        inc++;
    }
    var date2 = new Date();
    return date2.getTime() - date1.getTime();
}

function loopWithForTenBillion() {
    var max = 10000000000; //10kkk
    var date1 = new Date();
    var inc = 0;
    for (var i = 0; i < max; i++) {
        inc++;
    }
    var date2 = new Date();
    return date2.getTime() - date1.getTime();
}

我的代码正在测试10亿次和100亿次交互的for和while循环。我想虽然while尽可能地进行了最优化,然后while会比在所有情况下都好,但它并没有像我想象的那样出现。对特定条件有更好的循环吗?这些循环是否有浏览器优化?在前端的情况下,我想不应该像我在这个例子中那样进行所有交互,但在具有节点的应用程序中可以有。在v8中是否有优化循环?

http://jsfiddle.net/alexfqc/vfmgc73n/

1 个答案:

答案 0 :(得分:1)

如果你测试whilefor循环基本上做同样的事情,你会发现它们的性能几乎相同,除非测量误差(并且测量误差非常容易介绍,那些以部分速度运行的CPU,直到/除非需要做很多工作,在机器上运行其他进程等等。)

这是一个更多的苹果对苹果比较:

function loopWithWhileOneBillion() {
    var max = 1000000000;
    var start = Date.now();
    while (max--) {
    }
    var end = Date.now();
    return end - start;
}

function loopWithForOneBillion() {
    var max;
    var start = Date.now();
    for (max = 1000000000; max; max--) {
    }
    var end = Date.now();
    return end - start;
}
/* *************************************** */

/* loop with 10kkk interactions */
function loopWithWhileTenBillion() {
    var max = 10000000000;
    var start = Date.now();
    while (max--) {
    }
    var end = Date.now();
    return end - start;
}

function loopWithForTenBillion() {
    var max;
    var start = Date.now();
    for (max = 10000000000; max; max--) {
    }
    var end = Date.now();
    return end - start;
}
console.log("loopWithWhileOneBillion: " + loopWithWhileOneBillion());
console.log("loopWithForOneBillion: " + loopWithForOneBillion());
console.log("loopWithWhileTenBillion: " + loopWithWhileTenBillion());
console.log("loopWithForTenBillion: " + loopWithForTenBillion());

我的结果 启动运行以加热CPU:

trial  while1B for1B
----- -------- -----
1          988   987
2          983   981
3          983   989

trial while10B for10B
----- -------- ------
1        12248  12245
2        12243  12240
3        12245  12242

它没有比那更接近......

当然,这种基准测试基本没用;循环必须做真正的工作,这里有任何有意义的东西。当然,循环的实际工作可能会在循环结构中淹没任何差异(如果有的话)。