7

我有一个 List 容器,开始时可能有多达 100,000 个项目。当程序运行时,这个列表会慢慢清空,我应该在清空列表时改变容量吗?

我做了一些测试,执行时间似乎是一样的,但是降低列表容量是否有很多开销?我可以找到很多关于增加容量的信息,但没有太多关于降低容量的信息。

4

3 回答 3

10

除非您的内存量非常低,否则这是一个微优化。

通常,不需要更改 a 的容量List<>

TrimExcess方法文档:

如果没有新元素将添加到集合中,此方法可用于最小化集合的内存开销。然而,重新分配和复制大数据的成本List<T>可能相当可观,因此如果列表超过 90% 的容量,TrimExcess 方法将不执行任何操作。这避免了为获得相对较小的收益而产生较大的重新分配成本。

于 2011-08-23T14:57:22.100 回答
3

算一下:100,000 个项目 * 每个项目 4 个字节 = 大约 400KB。如果这对您的程序来说内存开销太大,您可以调用 TrimExcess,因为 Oded 指出 一旦它变小就重新创建更小的列表。(我不确定减少容量是否真的会产生你想要的效果。)

于 2011-08-23T14:57:37.720 回答
2

降低列表的容量涉及到一个新的后备数组并复制数据,因此这是一项相对昂贵的操作。

在您的特定情况下,除非您开始遇到内存问题,否则我会说这是不值得的。

如果它成为一个真正的问题,可以采用的一种策略是创建一个“分块”实现,IList<>它使用的不是一个数组,而是多个,每个预先配置的 size ,并在之前的填充中添加额外的块(固定大小的数组)向上。这也允许列表通过在删除项目时释放未使用的块来相对便宜地缩小,同时将内存开销最小化为仅一个非完整块(最后一个)。

但是,这种方法会为列表上的所有操作增加性能开销,因为列表必须计算项目所在的块并根据需要创建新块。因此,除非您确实存在内存问题以及随着时间的推移真正改变大小的列表,否则它是没有用的。

于 2011-08-23T15:05:55.003 回答