更快的循环:foreach与一些(jsperf的性能与节点或Chrome不同)

Ale*_*les 2 javascript arrays performance performance-testing jsperf

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

作为jsperf是给我,我很困惑非常比谷歌浏览器控制台的NodeJS,或任何其他JS引擎带给我不同的结果。(此处为jsperf片段

jsperf性能不佳图片

这是代码段,您可以看到(可以在此处运行)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);
Run Code Online (Sandbox Code Playgroud)

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

编辑:正如我对下面问题的回答所指出的那样,此行为是有问题的,因为使用JSPERF时我打开了chrome开发工具,并且所有消息都记录到了控制台,这意味着结果实际上已更改。谨记将来,JSPERF在执行中使控制台保持打开状态时可能无法正常工作。

Ser*_*eni 8

来自MDN

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

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

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