C# 预定义列表容量

C# 预定义列表容量,c#,performance,generics,C#,Performance,Generics,为了防止多次重新分配,我的代码中有如下内容: List<T> result = new List<T>(100); 例如,目标是使前100个项目的分配更快。这是正确的方法还是我需要做其他事情?没问题 如果你不打算添加更多的项目,那么你可以像你写的那样保留它。如果你的应用程序使用了大量内存或者超出了它应该使用的内存,那么我会调用trimOverse(),但是它可能不值得,除非列表中包含的项目很少,比如少于30个左右,即使这样,你也可以保持它的原样。但是,如果您希望前100

为了防止多次重新分配,我的代码中有如下内容:

List<T> result = new List<T>(100);
例如,目标是使前100个项目的分配更快。这是正确的方法还是我需要做其他事情?

没问题


如果你不打算添加更多的项目,那么你可以像你写的那样保留它。

如果你的应用程序使用了大量内存或者超出了它应该使用的内存,那么我会调用trimOverse(),但是它可能不值得,除非列表中包含的项目很少,比如少于30个左右,即使这样,你也可以保持它的原样。但是,如果您希望前100个项目的分配速度更快,那么可以将初始大小设置为100,如果您知道要添加100多个项目,则可以将初始大小设置为100甚至更大。

让我们明确一下,这样做不会为分配100个T而保留内存,只为分配100个指向T的“指针”保留内存。因此,这是可以的,但可能没有多大帮助。

您不需要修剪。该列表跟踪实际添加了多少项,这与初始容量不同,初始容量只是一个预分配。

通过定义初始容量,您进行了必要的优化。 如果调用
trimOverse()
方法,可能会导致比实际需要更多的分配工作

trimOverse()
的代码说明:

重新分配和复制大型列表的成本可能会很高 然而,这是相当可观的,因此如果 该列表的容量超过90%

我所理解的是,你甚至可能不会因为那个电话而改变你名单上的任何东西。
在我看来,您确实没有从中获得多少好处。

如果不指定容量,您是否会遇到性能问题?我这样问是因为它看起来很像过早优化。@Daniel Hilgarth,这是过早优化。所讨论的代码涉及数据库工作,通常返回10个以上的对象。因此,我假设预分配将提高性能。@SBlackler,过早优化是指在不必要的情况下进行优化。这样做,你不仅浪费你的时间在你不应该关心的事情上(除非你真的知道你应该关心)。您还使代码变得不必要的复杂和难以维护。@svick,在这种情况下,
T
将始终是一个自定义定义的类。但是,如果它是一种值类型,这有关系吗?@SBlackler,这很重要,因为这会使这个答案不正确。如果
T
是一个值类型,则分配将不是对
T
的100个引用,而是直接分配100个
T
s。@svick:确定吗?如果(我是一个int)当你做我的列表时,会发生什么?这不就是我的副本吗?预订100美元有什么好处int@VdesmedT,添加到
列表中
只会将整数复制到内部数组中。保留100个整数的好处是不必重新分配内部数组以使其更大。这与值类型或引用类型相同。
result.TrimExcess();
return result;