嵌套 for 循环的最佳替代方案是什么?
What is the best alternative to nested for loops?
我正在尝试优化此代码,它会测量 space 中 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
首先,数学函数可以在 if() 测试循环中完成,因为那样会忽略 p == q 项。
然而,对于这种情况,我建议更典型的是有两个循环——外循环从 0 到倒数第二项,内循环从外循环的计数器+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 的每个实例遍历整个数组。
我正在尝试优化此代码,它会测量 space 中 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
首先,数学函数可以在 if() 测试循环中完成,因为那样会忽略 p == q 项。
然而,对于这种情况,我建议更典型的是有两个循环——外循环从 0 到倒数第二项,内循环从外循环的计数器+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 的每个实例遍历整个数组。