【问题标题】:When is it more appropriate to assign a new list than to .Clear() an existing list?什么时候分配新列表比分配给 .Clear() 现有列表更合适?
【发布时间】:2011-08-22 17:51:31
【问题描述】:

给定一个列表:

List<myType> myList = new List<myType>();

在运行时修改集合内容....

为了清除列表,我似乎有一些建议使用的例子

myList = new List<myType>();

而不是

myList.Clear();

我能想出很多理由让我更喜欢其中一种方法,但是否有任何其他好的基准或指南可以说明何时一种方法优于另一种方法?

【问题讨论】:

    标签: .net list performance construct


    【解决方案1】:

    如果列表很大(80 KB 或更多),那么它将存储在large object heap 上。 LOH 的官方指导是尽可能多地重用对象,以减少堆碎片。 LOH 不像常规堆那样被压缩。

    对于较小的列表,我发现创建一个新列表通常比调用Clear 更快。这并非总是正确,因此您可能最好在应用程序中同时测试它。

    如果您调用Clear,它只是将列表中的所有项目设置为其默认值并将Count 设置为0。它不会更改列表的容量。所以调用Clear 不会改变分配给集合的内存量。如果您想清除列表并减小其大小,请拨打Clear,然后拨打TrimExcess

    如果您不小心,您会遇到的一个问题是别名。如果您有多个对象引用同一个列表,则创建新列表不会删除那些其他引用。因此,您最终会得到两个列表。只是想一想。

    总而言之,我认为对此没有特别的“最佳实践”。我发现有时使用Clear 很好,有时最好分配一个新列表。

    【讨论】:

    • +1 这更符合我正在寻找的内容。谢谢。你有关于 LOH 的链接吗?
    • @Matthew:查看我刚刚添加的链接。关于它有一篇很好的 CLR Inside Out 文章。
    • 我知道这是一个老问题,但它只是被链接为重复,阅读答案让我想知道一些事情......当你谈到列表的大小时,它是如何计算的?大概列表的大小不是列表内容的大小,因为它们都是引用(如果它是引用类型的列表),所以它只是所有引用的大小(我忘记了有多大那将是)...?
    • @Chris:列表的大小将是它的Capacity 乘以引用的大小(假设它是引用类型的列表),加上少量(小于 100 字节)的开销.引用在 32 位运行时为 4 个字节,在 64 位运行时为 8 个字节。因此,容量为 20,000 的列表大约为 80 KB 或 160 KB,具体取决于运行时。
    【解决方案2】:

    当您绑定到列表对象并从其他代码区域引用它时,请使用 clear 方法。如果您没有引用并且未绑定,那么创建一个新对象将是合适的。

    【讨论】:

    • 如果我想引用一个空列表,为什么清除它比仅仅为引用分配一个空列表更合适?
    • 这真的取决于你用它做什么。如果您只是创建一个空列表以作为参数传递给方法以在返回时对其进行引用 - 那很好。但是,我通常将 List 作为方法的返回项或输出参数。
    猜你喜欢
    • 1970-01-01
    • 2013-03-17
    • 1970-01-01
    • 2016-07-21
    • 2019-04-01
    • 1970-01-01
    • 2021-03-23
    • 2012-06-13
    • 2014-09-06
    相关资源
    最近更新 更多