哪个更高效:通过int [,]两次循环,或循环一次类?

时间:2015-02-11 04:18:50

标签: 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 "MovingObject to Collision" here.
}

我认为,因为我从两个for循环切换到一个循环,所以会更快。

  1. 在性能方面,使用for循环进行迭代是否重要?
  2. 出于好奇,我在foreach循环中迭代的内容是否重要?

1 个答案:

答案 0 :(得分:1)

两个循环将(几乎)同时进行。假设循环内的计算需要大多数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),这使得它真的更多更快。