2D阵列与1D阵列

时间:2011-08-13 14:41:05

标签: c# arrays

我已阅读Performance of 2-dimensional array vs 1-dimensional array

的问题

但最后说它可能是相同的(取决于地图自己的地图功能,C会自动执行此操作)?...

我有一个 1,000列和440,000,000行的矩阵,其中每个元素都是C#中的 double ...

如果我在内存中进行一些计算,哪一个在性能方面可以更好用? (请注意,我拥有保存这样一个monstrutru数量信息所需的记忆)...

3 个答案:

答案 0 :(得分:6)

如果你问的是哪个更好,一个大小为1000x44000的2D数组或一个大小为44000000的一维数组,那么就内存而言,有什么区别?你仍然拥有相同数量的元素!在性能和可理解性的情况下,2D可能更好。想象一下,当你确切地知道它们在2D数组中的位置时,必须手动找到一维数组中的每一列或一行。

答案 1 :(得分:2)

这取决于您执行的操作数量。在下面的示例中,我将数组的值设置为2500次。阵列的大小为(1000 * 1000 * 3)。 1D阵列耗时40秒,3D阵列耗时1:39分钟。

var startTime = DateTime.Now;
Test1D(new byte[1000 * 1000 * 3]);
Console.WriteLine("Total Time taken 1d = " + (DateTime.Now - startTime));

startTime = DateTime.Now;
Test3D(new byte[1000,1000,3], 1000, 1000);
Console.WriteLine("Total Time taken 3D = " + (DateTime.Now - startTime));

public static void Test1D(byte[] array)
{
    for (int c = 0; c < 2500; c++)
    {
        for (int i = 0; i < array.Length; i++)
        {
            array[i] = 10;
        }
    }
}

public static void Test3D(byte[,,] array, int w, int h)
{
    for (int c = 0; c < 2500; c++)
    {
        for (int i = 0; i < h; i++)
        {
            for (int j = 0; j < w; j++)
            {
                array[i, j, 0] = 10;
                array[i, j, 1] = 10;
                array[i, j, 2] = 10;
            }
         }
     }
}

答案 2 :(得分:1)

double[1000,44000]double[44000000]之间的差异不会很大。

你可能更适合使用[,]版本(让编译器找出寻址。但是你的计算模式可能会产生更大的影响(局部性和缓存使用)。

还要考虑数组数组变体double[1000][]。它是抖动的一个已知“特性”,它无法消除[,]数组中的范围检查。