已知分布的最佳列表容量

时间:2011-10-14 16:15:15

标签: c# list capacity

如果已知最终大小的一般分布,是否有最佳算法来定义构造函数中C#列表的容量?

作为一个具体的例子,如果每个列表中放置的值的数量平均值为500,标准差为50,则具有近似正态分布,就内存而言,列表的最佳初始容量是多少?消费

5 个答案:

答案 0 :(得分:1)

离开清单来决定。我不打扰设置它(只使用空构造函数),除非遇到具体的性能问题,此时可能还有其他事情可以先解决。

早期优化是万恶之源。

答案 1 :(得分:1)

这是个人意见,而不是基于研究,但请记住,List本身只保存引用到每个对象,因此最好在一边为一些分配空间而犯错误一些太多的引用,而不是意外地加倍你需要的引用量。考虑到这一点,额外(600或650)的两个甚至三个标准偏差可能不会超出范围。但是,这是我的意见,而不是研究结果。

答案 2 :(得分:1)

如果您使用三西格玛规则,http://en.wikipedia.org/wiki/68-95-99.7_rule表示如果您考虑3个标准差,则单个样本将在99.7%的时间内处于该范围内。

答案 3 :(得分:1)

我做了一些研究,似乎对这个问题有一个“正确”的答案。

首先,我同意这可能是过早优化,因此在决定切换之前进行分析是必不可少的。

Graph showing memory wasted by capacity for various standard deviations.

上图是使用正态分布在excel中生成的,并使用10,000个样本和平均值10,000来测试各种初始列表容量过度使用的空间。如您所见,它有几个有趣的功能。

  1. 对于低标准偏差,选择不良的初始容量可能会浪费高达最佳选择空间的八倍。
  2. 对于相对于平均值的高标准偏差,可以节省更少。
  3. 对应于最低内存浪费的低谷出现在取决于标准偏差的点上。
  4. 最好从图表的右半部分选择一个值,以避免列表重新分配。
  5. 我找不到最小浪费的确切公式,但基于此分析,平均值+ 1.75 x标准偏差似乎是最佳选择。
  6. 警告:YMMV与其他发行版,意味着等。

答案 4 :(得分:0)

没有正确答案。这将是内存使用和CPU之间的权衡。初始化列表越大,你可能浪费的内存越多,但节省了CPU,因为它不必在以后再次调整大小。