【发布时间】:2014-08-08 20:05:09
【问题描述】:
给定一个巨大的阵列和单核机器,并行或顺序迭代阵列会更快吗?假设在迭代过程中没有完成任何工作,它实际上只是对数组进行迭代。
我的直觉说按顺序执行会更快,但我无法以我对操作系统和处理器的了解来证明这个答案是正确的。似乎无论哪种方式都必须完成相同数量的工作,但并行执行会导致上下文切换的额外复杂性。
这个问题的真实世界扩展是javascript的forEach方法。 Native forEach 同步执行其回调
var a = [1,2,3,4,5,6...100000000000000];
a.foreach(function(number) {
// do computationally expensive, synchronous operation eg lots of additions/multiplications
});
console.log('done iterating through for loop and doing all of the work')
对上述代码使用异步版本的 forEach 会有好处吗(尤其是考虑到 js 只能使用单核)?
如果我们用异步工作做同样的问题,一旦阻塞操作发生,forEach 回调就会变成异步的。
var a = [1,2,3,4,5,6...100000000000000];
a.foreach(function(number) {
// do asynchronous work, eg access to filesystem
$.ajax({
url: 'http://google.com',
success: function() {
console.log('suceeded for ' + number)
})
});
console.log('done iterating through for loop but not with all async operations')
在这种情况下,使用 forEach 的异步版本是否有优势? 似乎我们已经通过仅切换到 IO 来更好地利用同步版本中的 CPU在我们启动 io 之前进行切换。
【问题讨论】:
-
你尝试过基准测试吗?
-
我没有 - 我想知道在我运行它的任何特定硬件上的理论答案而不是实际答案
标签: javascript concurrency parallel-processing