And*_*son 5 javascript performance mapreduce
1)我们知道,map()和reduce()没有副作用.如今,我们手机上也有多核心.那么使用它们会更有效吗?
2)另一方面,在大多数浏览器上只有1个js执行线程.为服务器端脚本准备map()和reduce()?
我今天刚刚测试了这个,使用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版本中可能会少得多.
它很容易被忽视,但获得 MapReduce 好处的关键是
A)利用优化的洗牌。通常,您的map和reduce函数可以用慢速语言来实现,只要shuffle(最昂贵的操作)得到很好的优化,它仍然是快速且可扩展的。
B) 利用检查点功能从节点故障中恢复(但希望您的 CPU 核心不会出现故障)。
所以最终,map-reduce 实际上既不是关于 map,也不是关于reduce 函数。这是关于它周围的框架;即使使用糟糕的“map”和“reduce”功能,这也会给您带来良好的性能(除非您在洗牌步骤中失去对数据集大小的控制!)。
在单个节点上执行多线程映射缩减所获得的收益相当低,并且很可能有比映射缩减更好的方法来并行化共享内存架构的商店......
不幸的是,现在围绕 MapReduce 有很多炒作(而且了解太少)。如果您查找原始论文,它会详细介绍“备份任务”、“机器故障”和“局部性优化”(这对于内存单主机用例来说都没有意义)。
仅仅因为它有一个“map”和一个“reduce”并不能使它成为“mapreduce”。
如果它具有优化的随机播放、节点崩溃和落后恢复功能,那么它只是一个 MapReduce。
归档时间: |
|
查看次数: |
5586 次 |
最近记录: |