繁体   English   中英

并行化 javascript 中的 for 循环

[英]parallelizing the for loop in javascript

我有一个嵌套的 for 循环

for(let i=0; i<500; i++){
   //some work
   for(let j=0; j<100000; j++){ 
     //some work
  }
}

有什么办法可以使它像 web worker 一样并行或快速异步?

我想不出我怎样才能使这些工作发挥作用。

内部 for 循环中的每项工作都独立于 watch 其他人。

我尝试使用 Promise.all() 来并行化代码,但没有成功

   for (let m = 0; m < keyCountMap.length; m += 2) {
        fetchWorker.postMessage([nodePages, keyCountMap]);
        // console.log(m, keyCountMap[m], keyCountMap.length);
        let myRoot = nodePages[keyCountMap[m]];
        const view = await Copc.loadPointDataView(filename, copc, myRoot);
        let getters = ["X", "Y", "Z", "Intensity"].map(view.getter);
        let chunkCount = 2;
        let totalCalled = 0;
        for (let j = 0; j < keyCountMap[m + 1]; j += chunkCount) {
          let remaining = keyCountMap[m + 1] - totalCalled;
          let localChunkCount = Math.min(chunkCount, remaining);
          totalCalled += localChunkCount;
          const pointTemp = new Array(localChunkCount).fill(null);
          const promises = pointTemp.map((element, index) =>
            readPoints(index + j, getters)
          );
          const done = await Promise.all(promises);
        }
      }

    const readPoints = (id, getters) => {
        return new Promise((resolve, reject) => {
          let returnPoint = getXyzi(id, getters);
          positions.push(
            returnPoint[0] - x_min - 0.5 * width,
            returnPoint[1] - y_min - 0.5 * width,
            returnPoint[2] - z_min - 0.5 * width
          );
          const vx = (returnPoint[3] / 65535) * 255;
          color.setRGB(vx, vx, vx);
          colors.push(color.r, color.g, color.b);
          return resolve(true);
        });
      };
    
      function getXyzi(index, getters) {
        return getters.map((get) => get(index));
      }

在单线程中,您只会获得“并行化”IO 调用或.network 调用的性能提升。 在您的情况下,它可能是Copc.loadPointDataView ,因此最重要的部分是将外部 for 循环的主体变成承诺。 内部循环并不重要,因为它们不包含 IO.network 调用,因此没有“等待时间”来保证安全。 但我会演示如何在所有层上使用 Promise.all。

let promises = [];

for (let m = 0; m < keyCountMap.length; m += 2) {
  promises.push((async () => {
    fetchWorker.postMessage([nodePages, keyCountMap]);
    // console.log(m, keyCountMap[m], keyCountMap.length);
    let myRoot = nodePages[keyCountMap[m]];
    const view = await Copc.loadPointDataView(filename, copc, myRoot);
    let getters = ["X", "Y", "Z", "Intensity"].map(view.getter);
    let chunkCount = 2;
    let totalCalled = 0;
    let innerPromises = [];
    for (let j = 0; j < keyCountMap[m + 1]; j += chunkCount) {
      innerPromises.push((async ()=>{
        let remaining = keyCountMap[m + 1] - totalCalled;
        let localChunkCount = Math.min(chunkCount, remaining);
        totalCalled += localChunkCount;
        const pointTemp = new Array(localChunkCount).fill(null);
        const readPointPromises = pointTemp.map((element, index) => readPoints(index + j, getters) );
        const done = await Promise.all(readPointPromises);
      })());
    }
    await Promise.all(innerPromises);
  })());
}

await Promise.all(promises);

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM