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

时间:2018-06-20 15:05:42

标签: javascript arrays performance performance-testing jsperf

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

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

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的控制台,nodejs或任何其他JS引擎不同?

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

2 个答案:

答案 0 :(得分:7)

来自MDN

  

除了通过以下方式之外,没有其他方法可以停止或中断forEach()循环:   引发异常。

使用[Test] [TestCase(1234)] [TestCase(5678)] [TestCase(7654)] public void TestSelect(int id) { DataTable old = Database.call("old_stored_proc", id); DataTable new_ = Database.call("new_stored_proc", id); Assert.AreEqual(old.Rows[0]["column"], new_.Rows[0]["column"]); } ,该循环将精确执行100000次。 使用foreach,一旦您的谓词返回true,循环就会停止。

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

答案 1 :(得分:0)

经过一番研究后,我了解到我做了什么使jsperf表现得很奇怪。 我在运行jsperf测试时打开了Chrome控制台

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

关闭控制台窗口后,您可以在此处看到标题...

enter image description here