对于Array,在javascript中使用map()和reduce()而不是forEach()更有效吗?

And*_*son 5 javascript performance mapreduce

1)我们知道,map()和reduce()没有副作用.如今,我们手机上也有多核心.那么使用它们会更有效吗?

2)另一方面,在大多数浏览器上只有1个js执行线程.为服务器端脚本准备map()和reduce()?

jac*_*ott 7

我今天刚刚测试了这个,使用map和reduce over floating point number,使用最新的node.js版本,答案是map和reduce比常规for循环慢两个数量级.

var r = array.map(x => x*x).reduce( (total,num) => total+num,0);
Run Code Online (Sandbox Code Playgroud)

〜11,000ms

var r = 0.0;
array.forEach( (x,i,a) => r += x*x  )
Run Code Online (Sandbox Code Playgroud)

〜300毫秒

var r = 0.0;
for (var j = 0; j < array.length;j++){
    var x = array[j];
    r += x*x;
}
Run Code Online (Sandbox Code Playgroud)

〜35MS

编辑:人们应该注意到这种差异在Firefox中要小得多,并且在未来的Node/Chrome版本中可能会少得多.


Ano*_*sse 0

它很容易被忽视,但获得 MapReduce 好处的关键是

A)利用优化的洗牌。通常,您的map和reduce函数可以用慢速语言来实现,只要shuffle(最昂贵的操作)得到很好的优化,它仍然是快速且可扩展的。

B) 利用检查点功能从节点故障中恢复(但希望您的 CPU 核心不会出现故障)。

所以最终,map-reduce 实际上既不是关于 map,也不是关于reduce 函数。这是关于它周围的框架;即使使用糟糕的“map”和“reduce”功能,这也会给您带来良好的性能(除非您在洗牌步骤中失去对数据集大小的控制!)。

在单个节点上执行多线程映射缩减所获得的收益相当低,并且很可能有比映射缩减更好的方法来并行化共享内存架构的商店......

不幸的是,现在围绕 MapReduce 有很多炒作(而且了解太少)。如果您查找原始论文,它会详细介绍“备份任务”、“机器故障”和“局部性优化”(这对于内存单主机用例来说都没有意义)。

仅仅因为它有一个“map”和一个“reduce”并不能使它成为“mapreduce”。
如果它具有优化的随机播放、节点崩溃和落后恢复功能,那么它只是一个 MapReduce。