更快的循环:foreach vs some(jsperf性能与node或chrome不同)

4

如何将数组的值简单地转换为truefalse,哪种方法最好。

我很困惑,因为jsperf给出的结果与google chrome控制台、nodejs或其他JS引擎给出的结果非常不同。(jsperf代码段在这里)

Bad jsperf performance Image

这是代码片段,您可以看到(在此处运行它),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的控制台、Node.js或任何其他JS引擎不同?
编辑: 如下面问题的答案所述,行为是有缺陷的,因为我在使用JSPERF时打开了Chrome开发工具,并且所有消息都被记录到控制台中,这意味着实际上结果已经改变。 请记住,在执行时保持控制台打开可能会导致JSPERF无法正常工作。

1
你可以测量上述代码的执行时间,亲自看看 :) - Yotam Omer
2个回答

13

来自MDN

除非抛出异常,否则无法停止或中断forEach()循环。

使用foreach,循环将会精确执行100000次。 使用some,只要您的谓词函数返回true,循环就会停止。

只要有可能谓词函数为true,some就更有效率。


3

经过一番研究,我明白了为什么jsperf表现得如此奇怪。 在运行jsperf测试时,我开着chrome控制台

我发现,当你打开chrome控制台时,jsperf仍会记录console.log等消息,而这正是导致测试结果误导的原因。

在此处,您可以看到在关闭控制台窗口后的测试结果...

enter image description here


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接