2Darrays与1Darrays

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

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

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

如果我在内存中进行一些计算,哪一个可以更好地用于性能方面? (请注意,我有需要存储这样一个monstruos数量的信息)…

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

这取决于您执行的操作数量。 在下面的示例中,我将数组的值设置为2500次。 arrays的大小为(1000 * 1000 * 3)。 1Darrays耗时40秒,3Darrays耗时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][] 。 它是抖动的一个已知“特性”,它无法消除[,]数组中的范围检查。