我在性能方面有个问题。假设我有一个称为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))