需要速度@清除列表c#

需要速度@清除列表c#,c#,C#,我想知道什么更快 list.Clear() or list = new List<..>()??? list.Clear()或list=new list()??? 哪一个留下了美好的记忆足迹 引擎盖下发生了什么 我知道这两个命令都做了两件不同的事情,因为第一个命令清除列表但不销毁实例,第二个命令释放旧实例但初始化新实例,尽管最终结果是相同的,那就是除去项目。下面介绍如何实现列表。Clear根据: Count设置为0,并从的元素引用其他对象 该系列也将发布 容量保持不变。重置 列表

我想知道什么更快

list.Clear() or list = new List<..>()???
list.Clear()或list=new list()???
哪一个留下了美好的记忆足迹

引擎盖下发生了什么


我知道这两个命令都做了两件不同的事情,因为第一个命令清除列表但不销毁实例,第二个命令释放旧实例但初始化新实例,尽管最终结果是相同的,那就是除去项目。

下面介绍如何实现
列表。Clear
根据:

Count设置为0,并从的元素引用其他对象 该系列也将发布

容量保持不变。重置 列表的容量,调用TrimOverse方法或设置 容量属性。降低容量会重新分配内存 并复制列表中的所有元素。修剪空列表 将列表的容量设置为默认容量

这种方法 是一个O(n)运算,其中n是计数

由于
Clear
是O(n),而实例化新列表是O(1),因此对于大型列表,重新实例化可能更快(对于短列表,差异可能可以忽略不计)


当然,因为(正如您已经知道的)它们的功能不同,所以您应该选择一个真正做您想要做的事情。

新的操作符将在托管堆中分配内存。如果
列表
是上一个列表的唯一根,那么该内存将在下一个GC期间被回收(除非您显式调用
GC.Collect
,否则它的执行是不可预测的,我不会这样做)


List.Clear
在内部调用了
Array.Clear
,我想它只是将目标数组中的所有位设置为0。这必须更快,但我不确定内存效率,因为它可能取决于特定的情况(如果您有一个巨大的列表,在
new
操作符之后,您将只使用其中的一部分,我认为,最好是释放旧内存,让列表的大小动态增长)

当创建一个新的列表时要考虑的一件事是,在其他地方,也可以保存对该列表的引用。如果创建新列表,这些引用将不会更改,代码将引用旧列表

在这种情况下,使用
Clear
清除列表更安全,因为所有引用列表的地方现在都将使用清除的列表

例如:

List<...> myGlobalList = new List<...>();
...

SomeWorkerClass wc = new SomeWorkerClass(myGlobalList);
myGlobalList = new List<...>();
List myGlobalList=new List();
...
SomeWorkerClass wc=新的SomeWorkerClass(myGlobalList);
myGlobalList=新列表();

wc
仍将使用原始列表,而不是
myGlobalList

的新实例,因为它们执行不同的操作,您实际上在追求哪种行为?你有没有证据表明需要提高速度?在“更流畅、更快、更好”中唯一可以衡量的是“更快”。“量一量吧!”马立克说。偶尔有一些有趣的事情是很好的。因为
List.Clear
是O(n),我想这取决于列表有多大:当然这很有趣,但是这样做以后没有人会为你的问题找到可能的答案。如果你把use与Clear比较,您可能还应该考虑旧列表的销毁/最终确定的运行时复杂性。这不是免费的。此外,如果列表用于相同数量的元素,预分配的容量可能是有利的。好的一点-你知道列表销毁的复杂性是什么吗?我想一个重要的区别是旧列表不一定会立即被垃圾收集,也不会像调用
Clear
那样阻碍程序执行。