【问题标题】:Looping through a huge array in JavaScript在 JavaScript 中循环一个巨大的数组
【发布时间】:2016-03-14 04:31:28
【问题描述】:

我正在从这个提供者那里得到响应,那里有一个巨大而深的数组。

我只需要遍历这个数组并做一些简单的计算,但处理时间很长。

使用 JavaScript 执行此操作的最佳做​​法是什么?

【问题讨论】:

  • 该计算是否总是在一定深度的元素上进行,还是深度变化?
  • @HunanRostomyan 它在一定深度完成;说4。
  • 然后循环数组4次...使用一些计数器;在启动时对其进行初始化,然后将其从 4 减少到 0。

标签: javascript arrays node.js


【解决方案1】:

如果您在现代浏览器中使用 HTML5,则可以使用 WebWorkers:http://ejohn.org/blog/web-workers/

或者你也可以使用自制的方法:Execute Background Task In Javascript

【讨论】:

  • 因为它被标记为node.js 我相信OP有更多的线程选项。
  • @SteveWellens node.js 最流行的选项是什么?根据我的发现,node-webworker-threads 在他们的示例中的表现似乎并不令人印象深刻。
  • @TuanAnhTran 我不知道最受欢迎的选项是什么。如果他们有点慢......谁在乎:他们在后台线程中。
  • @SteveWellens 如果他们在后台,这并不意味着他们可以运行缓慢。
【解决方案2】:

进行繁重计算的最佳方法是启动 WebWorker。请记住,将大对象传输给 worker 很慢,因此您可能希望在 worker 本身中获得响应(例如启动 ajax)。

如果你卡在一个线程上,你可以使用下面的方法将计算拆分成更小的部分,但是如果单次迭代花费的时间太长,这对你没有帮助。

function eachAsync(array, fn) {
  return new Promise(function(resolve, reject) {
    var index = 0;
    function chunk() {
      try {
        var end = performance.now() + 20;
        for(;;) {
          if (index < array.length) {
            var current = index++;
            fn(array[current], current);
          } else {
            resolve();
            break;
          }
          if (performance.now() >= end) {
            schedule();
            break;
          }
        }
      } catch(e) {
        reject(e);
      }
    }
    function schedule() {
      setTimeout(chunk, 10);
    }
    schedule();
  });
}

【讨论】:

    猜你喜欢
    • 2016-02-18
    • 2011-09-23
    • 1970-01-01
    • 2014-08-27
    • 2014-01-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多