【问题标题】:Faster loop: foreach vs some (performance of jsperf is different than node or chrome)更快的循环:foreach vs some(jsperf 的性能与 node 或 chrome 不同)
【发布时间】:2018-06-20 15:05:41
【问题描述】:

将数组的值恢复为简单的truefalse 值的最佳方法是什么。

我很困惑,因为 jsperf 给我的结果与 google chrome 控制台、nodejs 或任何其他 JS 引擎给我的结果不同。 (jsperf snippet here)

这是代码 sn-p,你可以看到(你可以在这里运行它)some 比使用 foreach 循环快 100 倍

var array = [];
var i = 0;
var flag = false;
while (i< 100000) {
    array.push(Math.random()*10000);
    i++;
}

console.time('forEach');
array.forEach((item) => {

    if (!flag && item > 10000/2) {
        flag = true;
        return;
    }
    return false
});
console.timeEnd('forEach');
console.log(flag);

flag = false;
console.time('some');
flag = array.some((item) => {

    if (item > 10000/2) {
        return true;
    }
    return false
});
console.timeEnd('some');
console.log(flag);

问题是,为什么 JSPERF 给出的结果与 chrome 的控制台、nodejs 或任何其他 JS 引擎不同?

编辑: 正如我对下面问题的回答所述,这种行为是错误的,因为 我在使用 JSPERF 时打开了 chrome 开发工具,并且所有消息都被记录到控制台,这意味着实际上结果改变了。 请记住,在执行时让控制台保持打开状态时,JSPERF 可能无法正常运行。

【问题讨论】:

  • 你可以测量一下你上面代码的执行时间,自己看看:)

标签: javascript arrays performance performance-testing jsperf


【解决方案1】:

来自MDN

没有其他方法可以停止或中断 forEach() 循环 抛出异常。

使用foreach,循环将准确执行 100000 次。 使用some,一旦你的谓词返回true,循环就会停止。

只要你的谓词有机会为真,some 就会更有效率

【讨论】:

    【解决方案2】:

    在研究了一下之后,我明白了我做了什么让 jsperf 以一种奇怪的方式表现。 我在运行 jsperf 测试时打开了 chrome 控制台

    我已经看到,当您打开 chrome 控制台时,jsperf 仍然会在脚本执行时记录 console.log 和类似消息,这就是导致测试结果误导的原因。

    您可以在此处看到 CLOSING 控制台窗口后的 tets...

    【讨论】:

      猜你喜欢
      • 2016-01-12
      • 1970-01-01
      • 2012-04-02
      • 2016-03-25
      • 2017-07-14
      • 2018-01-04
      • 1970-01-01
      • 2012-10-02
      • 2021-01-25
      相关资源
      最近更新 更多