gpt4 book ai didi

javascript - 并行或同步迭代一个巨大的数组会更快吗?

转载 作者:行者123 更新时间:2023-11-29 19:35:44 24 4
gpt4 key购买 nike

给定一个巨大的数组和一个单核机器,并行或顺序迭代数组会更快吗?假设没有任何工作作为迭代的一部分完成,它实际上只是在数组上迭代。

我的直觉告诉我按顺序执行会更快,但我无法以我对操作系统和处理器的了解来证明这个答案的合理性。看起来无论哪种方式都必须完成相同数量的工作,但并行执行会导致上下文切换的额外复杂性。

这个问题在现实世界中的扩展是 javascript 的 forEach 方法。原生 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 之前进行切换。

最佳答案

只要您使用的是单核,进行某种并行操作就没有任何优势。您是正确的,设置多个任务/线程会给每个任务/线程带来一定的开销。跨并行操作分时单核会在每个任务切换时产生开销。顺序迭代没有这样的开销。只有当您拥有多个内核时,您才有并行操作的优势。

现代 CPU 都是流水线的,其中大部分都是超标量启动的。但是尝试某种并行操作不会“打包管道”或填充超标量单元。我不知道那里有任何 Javascript 引擎可以做到这一点。

哦,郑重声明,使用 for 循环比使用 foreach 更好。原因很简单,foreach 必须在每次传递时调用一个函数,即使它是一个匿名函数。调用函数会产生一定的开销。一个 for 循环,其中函数的内容被内联到循环体中,将没有这样的开销。这在其他论坛上引起了广泛争论,但我自己的经验证实了这一事实。

关于javascript - 并行或同步迭代一个巨大的数组会更快吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25211434/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com