Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/performance/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 哪一个更有效:在int[,]中循环两次,还是在类中循环一次?_C#_Performance - Fatal编程技术网

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
    循环中迭代什么重要吗?
  • 两个循环将花费(几乎)相同的时间。假设循环内部的计算需要大多数CPU周期(在您的例子中是碰撞检查),那么循环本身的周期(增量x,y)可以忽略不计

    在您的
    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) ...