更快的循环:foreach vs some(jsperf 的性能不同于节点或 chrome)
Faster loop: foreach vs some (performance of jsperf is different than node or chrome)
将数组的值恢复为简单的 true
或 false
值的最佳方法是什么。
我很困惑,因为 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
就会更有效率
将数组的值恢复为简单的 true
或 false
值的最佳方法是什么。
我很困惑,因为 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
就会更有效率