二维阵列vs一维阵列

本文关键字:阵列 vs 一维 二维 | 更新日期: 2023-09-27 18:05:35

我已经阅读了二维数组与一维数组性能的问题

但在结论中,它说可以是相同的(取决于map自己的map函数,C自动做到这一点)?…

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

如果我在内存中做一些计算,哪一个在性能方面可以更好地使用?(请注意,我有足够的内存来容纳如此大量的信息)…

二维阵列vs一维阵列

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

这取决于您执行了多少操作。在下面的示例中,我将数组的值设置了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;
            }
         }
     }
}

double[1000,44000]double[44000000]之间的差异不显著。

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

还要考虑数组的数组变体double[1000][]。这是抖动的一个已知的"特征",它不能消除[,]数组中的范围检查。