二维阵列vs一维阵列
本文关键字:阵列 vs 一维 二维 | 更新日期: 2023-09-27 18:05:35
我已经阅读了二维数组与一维数组性能的问题
但在结论中,它说可以是相同的(取决于map自己的map函数,C自动做到这一点)?…
我有一个矩阵,它有1,000列和440,000,000行其中每个元素都是双在C#
…
如果我在内存中做一些计算,哪一个在性能方面可以更好地使用?(请注意,我有足够的内存来容纳如此大量的信息)…
如果你问的是哪个更好,大小为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][]
。这是抖动的一个已知的"特征",它不能消除[,]
数组中的范围检查。