3

在我的应用程序中,我每帧执行一次 System.Array.Resize。最初,我将数组设置为最大可能大小,然后将它们调整为更小的值。在某些情况下,它可能会小很多,在其他情况下,它可能会更小一些。但在我看来,要调整大小的元素越多,所需的时间就越长。也许我的观察是错误的,这就是我在这里问的原因。

4

3 回答 3

6

应该可以,调整大小涉及将新内存分配到您想要的大小并将旧数组复制到新数组中。数组越大,复制的越多。

来自 MSDN

此方法分配一个指定大小的新数组,将元素从旧数组复制到新数组,然后用新数组替换旧数组。

在不太了解代码的情况下,尝试使用List<T>来管理列表和您需要做的调整大小,当您需要将其提供给 Unity 时,请调用list.ToArray();.

这仍然会创建数组并复制它,但每帧只复制一次。

于 2012-06-19T15:09:31.127 回答
3

正如其他答案所指出的,“调整大小”数组需要复制所有元素,当 N 变大时,这是一个 O(N) 操作。请注意,有多种方法可用于复制数组,具有不同的“设置”和“每项”成本。一个小的数组复制操作一次可以处理 4 个字节(或者在某些情况下,一次一个字节),而一个较大的数组操作将使用特殊的 16 字节操作来完成大部分复制。这些操作仅限于一次写入对齐的 16 字节内存块。根据源和目标对齐方式,大型数组操作可能需要复制四组四字节(其中最后一个字节将与下一组重叠),多组 16 字节,以及另外四组四字节(第一个字节)这将与前一组重叠)。

请注意,最小化数组大小调整成本的真正关键是尽可能少地这样做。每当List<T>类型必须扩展其数组的大小时,它就会加倍。如果它的数组从 16 项开始,那么当它将数组加倍到 256 个元素时,128 将为空,64 将被复制一次,32 将被复制两次,16 将被复制三次。请注意,虽然某些元素最终会被复制 lg(N) 次,但在构建大小为 N 的列表的过程中,元素复制操作的总数将始终小于 2N。

没有办法将 a 的后备数组List<T>作为数组访问,但是以公开数组的方式重新实现类是相当容易的,并确保任何接受数组作为参数的方法都允许指定要使用的部分的长度(而不仅仅是访问Length数组的属性)。

于 2012-06-19T15:52:31.740 回答
2

是的。数组调整大小是一个 O(n) 操作。它必须将每个元素复制到新数组中。

但是,如果您不使用数组,也许会更好?数组是做什么用的?可能有适合您的应用程序的更好的数据结构。

于 2012-06-19T15:13:01.167 回答