【发布时间】:2019-04-30 15:13:42
【问题描述】:
我正在尝试查看 for 和 reduce 在数值数组上的性能差异,我可以看到 always 我正在测量的第二个函数(无论是什么,for 或 reduce)更快比第一个。我猜这与使用节点的数据缓存或线程池大小有关。这是代码:
process.env.UV_THREADPOOL_SIZE = 1;
let array = [
1,
23,
4,
5,
6,
7,
8,
7,
65,
4,
3,
23,
43,
2,
23,
32,
23,
23,
234,
243,
423,
432,
43,
23,
2,
23,
2,
23,
];
let sum = 0;
console.time('reduce');
sum = array.reduce((s, p) => (s += p), 0);
console.timeEnd('reduce');
sum = 0;
console.time('for');
for (let i = 0; i < array.length; i++) {
sum += array[i];
}
console.timeEnd('for');
这段代码显示了不同的结果:
process.env.UV_THREADPOOL_SIZE = 1;
let array = [
1,
23,
4,
5,
6,
7,
8,
7,
65,
4,
3,
23,
43,
2,
23,
32,
23,
23,
234,
243,
423,
432,
43,
23,
2,
23,
2,
23,
];
let sum = 0;
console.time('for');
for (let i = 0; i < array.length; i++) {
sum += array[i];
}
console.timeEnd('for');
sum = 0;
console.time('reduce');
sum = array.reduce((s, p) => (s += p), 0);
console.timeEnd('reduce');
我的意思是,如果你颠倒执行顺序,测量的结果就会不同。
为了进行测试,我使用的是 node v11.11.0
有什么想法吗?
编辑:我不是在寻找解释为什么 reduce 比 for 或类似的东西更快。我想知道为什么 nodejs 会产生这样的操作序列。
【问题讨论】:
-
Regular
for应该总是更快,因为它不需要实例化回调并检查是否有要处理的元素。 -
我认为他的意思是第二个选项总是更快,即使他切换它们。
-
@Wendelin 不,
for总是更快:prntscr.com/nir8zg -
您的基准测试可能存在缺陷。在执行之前预热这两个函数。
-
这是一个 jsperf:jsperf.com/sum-array-reduce-vs-for-loop
标签: javascript node.js ecmascript-6