在阅读了这个问题中公认的优秀答案后:
我决定将我的初始容量设置为一个很大的猜测值,然后在读取所有值后对其进行修剪。我怎样才能做到这一点?也就是说,我怎样才能修剪字典,以便 gc 稍后收集未使用的空间?
我的目标是优化。我经常有大数据集,小数据集的时间损失是可以接受的。我想避免重新分配和复制在大型数据集上以小初始容量引起的数据的开销。
在阅读了这个问题中公认的优秀答案后:
我决定将我的初始容量设置为一个很大的猜测值,然后在读取所有值后对其进行修剪。我怎样才能做到这一点?也就是说,我怎样才能修剪字典,以便 gc 稍后收集未使用的空间?
我的目标是优化。我经常有大数据集,小数据集的时间损失是可以接受的。我想避免重新分配和复制在大型数据集上以小初始容量引起的数据的开销。
根据 Reflector,Dictionary 类永远不会缩小。void Resize()
被硬编码为总是加倍大小。
您可能可以创建一个新字典并使用相应的构造函数来复制项目。这将是非常低效的。
或者,使用现有的字典作为蓝图来实现您自己的字典。这比你最初想象的要少。
一定要对这两种方法进行基准测试。
您可能会考虑先将数据放入列表中。然后您知道列表的大小,并可以创建具有该容量的字典(现在完全适合您想要的数据)并填充它。
允许列表动态调整大小(在添加元素时)应该比允许字典调整大小便宜。(但是,正如其他人所指出的那样,请自己测试性能!)调整字典大小涉及重新散列操作,这意味着将再次调用每个元素的 GetHashCode,并将引用复制到新的数据结构中。调整列表大小只是意味着复制参考,所以应该更便宜。
在 .NET 5 中,TrimExcess方法完全符合您的要求:
将此字典的容量设置为最初使用其所有条目初始化时的容量。