C# 二维阵列与一维阵列

C# 二维阵列与一维阵列,c#,arrays,C#,Arrays,这个问题我已经读了好几年了 但总而言之,它说的可能是相同的(取决于map自身的map函数,C会自动执行此操作) 我有一个矩阵,它有1000列和440000000行,其中每个元素在C#中都是双精度的 若我在内存中做一些计算,那个么在性能方面使用哪一个更好?(请注意,我有存储如此海量信息所需的内存).如果您想问的是,大小为1000x44000的2D数组或大小为44000000的1D数组哪个更好,那么内存方面有什么区别?您仍然拥有相同数量的元素!在性能和可理解性方面,2D可能更好。想象一下,当您确切地

这个问题我已经读了好几年了

但总而言之,它说的可能是相同的(取决于map自身的map函数,C会自动执行此操作)

我有一个矩阵,它有1000列和440000000行,其中每个元素在
C#
中都是双精度的


若我在内存中做一些计算,那个么在性能方面使用哪一个更好?(请注意,我有存储如此海量信息所需的内存).

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

双精度[100044000]和双精度[44000000]之间的差异不会很大

使用
[,]
版本(让编译器计算地址)可能会更好,但计算模式可能会产生更大的影响(局部性和缓存使用)


还考虑数组变量数组,<代码>双[1000 ][]/COD>。它是已知的“抖动”特性,它不能消除<代码> []、[>数组中的范围检查。< /P> < P>这取决于您执行的操作数。在下面的示例中,我将数组的值设置为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;
            }
         }
     }
}
var startTime=DateTime.Now;
Test1D(新字节[1000*1000*3]);
WriteLine(“花费的总时间1d=“+(DateTime.Now-startTime));
startTime=DateTime.Now;
Test3D(新字节[10001000,3],10001000);
WriteLine(“花费的总时间3D=“+(DateTime.Now-startTime));
公共静态void Test1D(字节[]数组)
{
对于(int c=0;c<2500;c++)
{
for(int i=0;i
“怪兽”信息量?大约330 MB;这是浏览器仅用于几个打开的选项卡的信息量。当然,访问1D数组比访问2D数组快,但是如果需要2D数组,则使用1D数组模拟它需要手动进行计算,否则会自动进行计算,而这些计算可能具有大致相同的速度时间惩罚。所以使用1D数组会更快,我只需要做
*width
运算,对吗?作为一个一般的编程规则,最好是针对一个简单、可理解和逻辑的解决方案。优化往往会导致糟糕和复杂的解决方案。但这并不意味着不允许您进行优化你不应该从一开始就这样做。如果你发现你的代码太慢或太占用内存,那么以后再这样做。如果你的解决方案结构良好,那么以后应该很容易实现更改。如果你真的将1D数组用作1D数组,并且不必进行索引计算(宽度计算),那么1D数组只会更快为了像2D数组一样使用它。正是这些计算使它变慢。这是唯一提供证据的答案,而不仅仅是一个观点!我在以下博客中找到了2D数组花费更长时间的解释:TLDR:运行时可以使用特殊的IL指令访问1D数组,而对于nD数组,它需要方法调用。