C# 哪一个更有效:在int[,]中循环两次,还是在类中循环一次?
这是我当前检查平铺贴图碰撞的方式:C# 哪一个更有效:在int[,]中循环两次,还是在类中循环一次?,c#,performance,C#,Performance,这是我当前检查平铺贴图碰撞的方式: 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 "M
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.
}
列表冲突;
对于(i=0;i
我会假设,因为我正在从两个for
循环切换到一个,所以速度会更快
for
循环迭代什么重要吗?foreach
循环中迭代什么重要吗?for(x)/for(y)
examle中,计算将执行Length(x)*Length(y)
次。在(碰撞)的中
必须检查相同的碰撞次数。如果您尝试测试两个循环的性能,将很难看到任何差异
然而,第二种方法将更加优雅:
循环次数(几乎)与(i)循环的相同。(无法测量的差异…)
与往常一样,加快速度的诀窍是改变算法:
- 是否有可能检查数量有限的物体、碰撞
- 是否有机会使用已排序的对象列表,例如先检查近邻
这可能会将您的算法从O(n^2)更改为O(n)甚至O(logn),从而使它的速度大大提高。当然,在循环内循环的复杂度为O(n^2),即循环一次的复杂度为O(n)。但是,这两个代码是如何相互关联的呢?因为在这两种情况下内部代码并不相同,所以无法确定。让代码运行并在需要的地方进行优化是最有效的。如果您在优化方面非常努力,请注意2d数组比1d数组慢得多:。
foreach(var collision in collisions) ...