C#清除List <T>,值类型仍然是O(n)操作吗?

Han*_*ans 6 c# arrays performance list

根据Microsoft 文档,在List上调用Clear()是O(n)操作.我猜这是因为如果列表要保存引用,则需要将它们置空.我想知道如果列表具有值类型,Clear()是否仍然是O(n)操作,因为容量没有改变.重置索引指针和计数不应该足够吗?

我问这个是因为在当前的应用程序中,我们使用的列表在很短的时间内就被清除了数十万次,并想知道是否有不同的实现可以使它更快.

Meh*_*raz 4

检查List.Clear方法源代码:

Array.Clear(_items, 0, _size);
_size = 0;
Run Code Online (Sandbox Code Playgroud)

Array.Clear 是一个 extern 方法,MSDN 关于Array.Clear 的声明是:

将数组中的元素范围设置为每种元素类型的默认值。

因此即使 T 是值类型,它仍然是一个 O(n) 操作。