哪个更高效:遍历 int[] 两次,还是遍历 class 一次?
Which is More Efficient: Looping through int[,] twice, or looping through class once?
这是我目前检查瓦片地图碰撞的方式:
int[,] layer;
for (x = 0; ...)
{
for (y = 0; ...)
{
//Do collision checks here, based on index.
}
}
这是我正在考虑的备选方案:
List<Collision> collisions;
for (i = 0; i < collisions.Count; i++)
{
//Check for "MovingObject to Collision" here.
}
我假设,因为我从两个 for
循环切换到一个,它会更快。
- 性能方面,我用
for
循环迭代什么重要吗?
- 出于好奇,我在
foreach
循环中迭代的内容重要吗?
两个循环将花费(几乎)相同的时间。假设循环内的计算需要大多数 CPU 个循环(在您的情况下是碰撞检查),循环本身的循环(增量 x,y)可以忽略不计。
在您的 for(x)/for(y)
示例中,计算执行了 Length(x) * Length(y)
次。在 for(collisions)
中,您必须检查 相同的 碰撞次数。如果您尝试测试两个循环的性能,将很难看出任何差异。
第二种方法将允许更多优雅然而:
foreach(var collision in collisions) ...
循环次数(几乎)与 for(i)
循环相同。 (无法衡量的差异...)
像往常一样,加快速度的技巧是改变算法:
- 是否有可能检查有限数量的对象、碰撞?
- 是否有机会使用 排序 对象列表,例如首先检查近邻?
这可能会将您的算法从 O(n^2) 更改为 O(n) 甚至 O(log n),这使得它确实快很多。
这是我目前检查瓦片地图碰撞的方式:
int[,] layer;
for (x = 0; ...)
{
for (y = 0; ...)
{
//Do collision checks here, based on index.
}
}
这是我正在考虑的备选方案:
List<Collision> collisions;
for (i = 0; i < collisions.Count; i++)
{
//Check for "MovingObject to Collision" here.
}
我假设,因为我从两个 for
循环切换到一个,它会更快。
- 性能方面,我用
for
循环迭代什么重要吗? - 出于好奇,我在
foreach
循环中迭代的内容重要吗?
两个循环将花费(几乎)相同的时间。假设循环内的计算需要大多数 CPU 个循环(在您的情况下是碰撞检查),循环本身的循环(增量 x,y)可以忽略不计。
在您的 for(x)/for(y)
示例中,计算执行了 Length(x) * Length(y)
次。在 for(collisions)
中,您必须检查 相同的 碰撞次数。如果您尝试测试两个循环的性能,将很难看出任何差异。
第二种方法将允许更多优雅然而:
foreach(var collision in collisions) ...
循环次数(几乎)与 for(i)
循环相同。 (无法衡量的差异...)
像往常一样,加快速度的技巧是改变算法:
- 是否有可能检查有限数量的对象、碰撞?
- 是否有机会使用 排序 对象列表,例如首先检查近邻?
这可能会将您的算法从 O(n^2) 更改为 O(n) 甚至 O(log n),这使得它确实快很多。