在使用.NET </t> </t>的内存使用方面,使用Stack <t>会优于List <t>

时间:2008-10-27 18:01:07

标签: .net

所以在.NET应用程序中,我需要将大约200万个项目保存在内存中进行处理,1比1,将这些项目保存在Stack集合中,比将它们保存在List集合中更好,假设堆栈对象使用的内存将在每次从堆栈对象中跳出时保持最小化,或者堆栈分配的内存将保持不变,直到堆栈设置为null或清除。

抱歉,如果我不能以正确的方式表达问题..但是这是另一种方式,当使用Stack集合时,每次从堆栈中拉出一个项目时,堆栈使用的内存是否最小化

提前致谢

3 个答案:

答案 0 :(得分:4)

如果您肯定想要FILO行为,它们对于Stack<T>基本上是相同的 - 因为当您从List<T>的末尾删除元素时,它不需要复制任何内容。

现在,如果你在谈论一个不同的Queue<T> - 从List<T> head 中移除涉及复制其余项目,这是低效的。

其中任何一个的实际内存使用情况都是相同的 - 当删除元素时,我不相信List<T>Stack<T>自动“修剪大小”。

答案 1 :(得分:4)

没有区别。 Stack的“Pop”方法永远不会减小内部数组的大小。当达到限制时,“推”方法将大小加倍。

我使用.NET Reflector来发现这一点。

答案 2 :(得分:1)

从堆栈中弹出一个对象将从堆栈中删除对象的引用。然后,由垃圾收集器决定何时释放内存。但是,根据对象的不同,您可以在每次循环迭代后调用.Dispose(),以释放对象正在使用的任何未管理的资源,这些资源在您的情况下可能有用,也可能没用。如果您正在使用您设计的类,则可以实现IDisposable以提供此功能。

正如另一张海报指出的那样,Pop永远不会自动减少已分配的内存量,但可能会通过调用Stack的TrimExcess()方法强制执行此操作。您可以每100次迭代调用一次来释放堆栈正在使用的内存。 Stacks的另一个好处是Pop()始终是O(1)操作。

减少内存使用量的另一种方法是一次只加载1000个对象,然后在迭代后加载下一个1000并重复直到所有对象都已加载。