更快的循环:foreach vs some(jsperf 的性能不同于节点或 chrome)

Faster loop: foreach vs some (performance of jsperf is different than node or chrome)

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

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

这是代码片段,您可以看到(您可以在此处 运行)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 可能无法正常运行。

经过一番研究后,我明白了我做了什么让 jsperf 以一种奇怪的方式运行。 当 运行 jsperf 测试

时,我打开了 chrome 控制台

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

在这里你可以看到 关闭 控制台后的 tets window...

来自 MDN

There is no way to stop or break a forEach() loop other than by throwing an exception.

使用一个foreach,循环将恰好执行100000次。 使用 some,一旦您的谓词 returns 为真,循环就会停止。

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