Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/398.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 并行或同步迭代一个巨大的数组会更快吗?_Javascript_Concurrency_Parallel Processing - Fatal编程技术网

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

Javascript 并行或同步迭代一个巨大的数组会更快吗?,javascript,concurrency,parallel-processing,Javascript,Concurrency,Parallel Processing,给定一个巨大的阵列和一台单核机器,并行或顺序迭代阵列会更快吗?假设迭代中没有做任何工作,它实际上只是在数组上迭代 我的直觉告诉我按顺序操作会更快,但我无法用我对操作系统和处理器的了解来证明答案的正确性。这两种方式似乎都需要做同样多的工作,但并行执行会给上下文切换带来额外的复杂性 这个问题的实际扩展是javascript的forEach方法。本机forEach同步执行其回调 var a = [1,2,3,4,5,6...100000000000000]; a.foreach(function(nu

给定一个巨大的阵列和一台单核机器,并行或顺序迭代阵列会更快吗?假设迭代中没有做任何工作,它实际上只是在数组上迭代

我的直觉告诉我按顺序操作会更快,但我无法用我对操作系统和处理器的了解来证明答案的正确性。这两种方式似乎都需要做同样多的工作,但并行执行会给上下文切换带来额外的复杂性

这个问题的实际扩展是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而不是在启动IO之前切换来更好地利用CPU。

只要您使用单核,就没有任何好处,进行某种并行操作。设置多个任务/线程会给每个任务/线程带来一定的开销,这是正确的。而在并行操作系统中对单核进行分时会导致每个任务切换的开销。顺序迭代没有这样的开销。并行操作的唯一优势是拥有多个内核

现代CPU都是流水线的,而且大多数都是超标量引导的。但是,尝试某种并行运算不会“打包管道”或填充超标量单位。我不知道任何Javascript引擎都能做到这一点


哦,为了记录在案,你最好使用for循环而不是foreach。原因很简单,foreach每次都必须调用一个函数,即使它是匿名函数。调用函数会产生一定的开销。for循环(函数的内容内联到循环体中)将不会有这样的开销。这一点在其他论坛上已被广泛讨论,但我自己的经验证明了这一点。

这完全取决于代码(很高兴您提供了这一点)。所以你的第一个问题的答案是否定的。对于第二个问题,这取决于

如果代码在单核机器中是完全CPU绑定的,那么同步版本会快一点。如果有任何IO绑定代码,异步版本在同一台机器上会更快。因为访问IO与CPU无关

只有在多核机器上,cpu绑定的代码在异步模式下运行时才会运行得更快。IO绑定的代码仍将比同步代码运行得更快

这是一张夏季餐桌

type                                  cpu bound   io bound   mixed
-------------------------------------------------------------------
single-core synchronous               normal      slower     slower
single-core asynchronous              normal      faster     faster
multi-core synchronous                normal      slower     slower
multi-core asynchronous               faster      faster     faster
笔记:
  • 它假设在一次迭代中运行的所有代码彼此不依赖
  • 在大多数实际使用案例中,我们想要并行化的代码是IO和CPU的混合
  • 很难区分IO绑定和CPU绑定部分

  • 绝对地如果有疑问,请查看此项。forEach是速度最慢的。你试过基准测试吗?我没有-我想知道的是理论上的答案,而不是在我运行它的任何特定硬件上的实际答案