performance-foreach内部有条件vs filter中有相同条件,foreach在javascript中的



我在性能方面有个问题。假设我有一个称为records的庞大对象数组。我的目标是创建一个集合(确保我有不同的值(,其中包含来自records的记录的值value满足一定条件——CCD_ 4。我有两种可能的方法可以产生想要的结果:

选项1:

const set = new Set();
records.foreach(rec => {
if(rec.otherValue === 'something specific'){
set.add(rec.value);
}
});

第一种选择是直截了当。如果满足特定条件,我会查看所有记录,并将所需值添加到Set中。

选项2:

const set = new Set();
const filteredRecords = records.filter(rec => rec.otherValue === 'something specific');
filteredRecords.foreach(rec => {
set.add(rec.value);
});

第二个选项首先过滤大量的records数组,以获得更具体的对象数组(从数百条记录到少于10条(,然后将所需的值添加到集合中。

两种选择产生完全相同的结果。我的问题是:哪一个是性能最好的?我的目标是使函数尽可能快。如果还有第三种,甚至更快的选择,请分享。

测试这个
我很好奇现代方法的速度有多快,所以我在JSPerf上设置了一些测试。以下是我的发现:

  • for循环和forEach()方法的性能非常接近
  • map()filter()这样的方法的速度大约是使用forEach((并推送到新数组以执行相同操作的速度的两倍
  • 使用forEach()进行多步骤操作的速度大约是filter()map()等链接方法的两倍
  • 这些结果在Chrome、Firefox和Safari中是一致的。我担心只有V8 JavaScript渲染引擎以这种方式进行了优化,但所有现代浏览器都看到了类似的结果

链接到源
的基准:reduce((、filter((、map((、forloop和forEach((

我多次尝试运行基准测试,得到的for循环最慢,而forEach()reduce()最快。

您还可以使用另一个选项,即reduce()

这里有一个例子:

let data = [
{
id: 1,
value: 'one'
}, {
id: 2,
value: 'two'
}, {
id: 3,
value: 'three'
}, {
id: 4,
value: 'four'
}, {
id: 5,
value: 'five'
},
];
// Filters IDs of odd numbers [1,3,5]
let new_arr = data.reduce((a, b) => {
if ([1,3,5].includes(b.id)) {
a.push(b.value);
}
return a;
}, []);
console.log(new_arr); // Expected Result: ['one', 'three', 'five']
// Or you can use this one Liner
let new_arr_1 = data.reduce((a, b) => a.concat(([1,3,5].includes(b.id) ? b.value: [])), []);
console.log(new_arr_1); // Expected Result: ['one', 'three', 'five']

如果你想要速度,在性能方面,没有什么能比得上原生(香草(javascript。然后,

for (var i=0; i< records.length; i++) {
// your operations
}

请检查:为什么使用for比some((或filter((更快

https://web.archive.org/web/20170403221045/https://blogs.oracle.com/greimer/entry/best_way_to_code_a

这个呢?我认为它可读性很高,这远比性能更重要。

const condition = val => val === 'something specific'
const set = new Set(records.filter(condition))

最新更新