首页 > 解决方案 > 嵌套 for 循环的最佳替代方案是什么?

问题描述

我正在尝试优化这段代码,它测量空间中 2 个点的长度,如果长度合适,则画一条线。问题是它非常慢(主要在智能手机上)。有什么我可以做的让它更快吗?就像避免一些不必要的代码一样。我已经尝试了好几个星期。

   this.dots.forEach(p => {
      this.dots.forEach(q => {
        // Using  x * x instead of Math.pow for efficiency
        let z = Math.sqrt((q.x - p.x) * (q.x - p.x) + (q.y - p.y) * (q.y - p.y));

        if(p != q && z < this.STRING_MAX && z > this.STRING_MIN) {

         // Background's oposite color
          if(p.y > p5.windowHeight + 45) {
            p5.stroke(0, this.transp);
          } else {
            p5.stroke(255, this.transp);
          }
          p5.line(p.x, p.y, q.x, q.y);
        }
      });
    });

这就是它的外观(它不仅画线,这就是它变慢的原因): Neural Fuse

Gitlab项目

标签: javascriptoptimizationnested-loops

解决方案


首先,Math 函数可以在 if() 测试循环中完成,因为它会忽略 p == q 个项目。

但是,对于这种情况,我建议更典型的是有两个循环——外循环从 0 到倒数第二项,内循环从外循环的 counter+1 到最后一项:

for (let i = 0; i < items.length - 1; i++) {
  for (let j = i + 1; j < items.length; j++) {
    // check values at i and j
  )
}

这样,i 和 j 将永远不会相同,并且您永远不需要为 i 的每个实例遍历整个数组。


推荐阅读