是否存在比以下更聪明的方法来调整矩形数组的大小?
double[,] temp = new double[newSize, originalSecondDimension];
Array.Copy(original, temp, original.Length);
我担心重复一个巨大的数组和执行它所需的内存。 Array.Resize()在内部做什么?
谢谢,
阿尔贝托
答案 0 :(得分:3)
您应该将性能微优化推迟到实际测量和观察问题的时间点。那说......
在.NET中调整数组大小需要重新分配它们。 .NET进程中的内存(通常)没有间隙地布局 - 因此您无法在不将其移动到新的情况下调整类似数组的大小堆中的位置。
您通常不应该关心Resize()
内部如何运作 - 但在这种情况下,the documentation实际上明确地描述了会发生什么:
此方法使用分配新数组 指定的大小,复制元素 从旧阵列到新阵列,和 然后用。替换旧数组 新的。
请记住,.NET中的内存分配非常有效 - 它主要涉及将高水位标记指针移动到堆的地址空间并将内存清零。除非你正在分配一个异常大的数组,或者在一个紧凑的循环中反复这样做,否则你不太可能遇到问题。
在您的情况下,实际上没有更好的方法来调整多维数据的大小。但是 - 您应该强烈考虑将此行为封装在自定义类中。传递原始数组对象并不是一个好主意 - 有太多方法可以解决问题。特别是,因为在调整大小时会有一个新的数组实例 - 它可以破坏任何保留对旧数组实例的引用的代码,并假设它们仍然有效。
您总是可以创建一个提供索引器属性的类,并且具有多维数组的语法“外观”,而不会实际暴露一个。不幸的是,据我所知,没有构建-in .NET类库中的多维集合类。但是,编写一个简单的包装器应该不会太难。
顺便说一句,如果你真的关心性能,你应该知道.NET多维数组比一维甚至是锯齿状数组(double[][]
)要慢得多。强>
答案 1 :(得分:2)
是的,有一种更聪明的方法:不要使用数组!如果您发现自己需要重新调整大小,那么您应该使用集合类型。< / p>
答案 2 :(得分:1)
我的猜测是你不能。 Array.Resize()需要ref T[]
,表明它的工作方式如下:
int[] a = new int[1];
int[] b = a;
Array.Resize(b,2);
Debug.Assert(a.Length == 1);
Debug.Assert(b.Length == 2);
如果数组可以改变大小,那么在并发代码中,你无法优化远程边界检查,并且你必须为每次访问做一些事情以阻止它在你脚下改变大小:
for (int i = 0; i < a.Length; i++) { sum += a[i]; }
可能有一个例外:理论上可以增加数组的大小,前提是不需要重新分配数组(内存对齐可能意味着将字节[1]调整为字节[4]通常应该是就地的)。不过,重新分配阵列更为常见,因此担心这一点毫无意义。