javascript - 而 x for at javascript

标签 javascript node.js performance loops

我正在测试 javascript 的 for 和 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();
}

我的代码正在测试十亿和一百亿交互的 for 和 while 循环。我猜想 while 是尽可能最优化的,那么 while 会比在所有情况下都更好,但它不会像我想象的那样发生。对于特定条件是否有更好的循环?浏览器是否对这些循环进行了优化?在前端情况下,我认为不应该像本示例中那样进行所有交互,但在具有 Node 的应用程序中可以进行交互。 v8 中有循环优化吗?

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

最佳答案

如果您测试 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

没有比这更接近的了......

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

关于javascript - 而 x for at javascript,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28674943/

相关文章:

node.js - Node js 上的 MongoDB 过期事件

ruby-on-rails - Sidekiq 排队 POST 创建参数。使用 JSON 或 ActionController::Parameters?

javascript将事件绑定(bind)到类名的更改

node.js - 访问文件夹内的文件,该文件夹位于 sails js(node js 框架)的 config 文件夹内

javascript - 替代正文 onload = (string) 用于 Javascript

node.js - 我使用 Parse.com 和 nodejs 进行用户身份验证,但每个人都是同一个用户

python - 有没有办法通过将 python 列表快速转换为 numpy 矩阵来搜索列表?

performance - 动态语言比静态语言慢吗?

javascript - 如何使用 jquery 从对象的嵌套数组创建嵌套 HTML

javascript - 将图像和文本设置为默认