2009-09-16 26 views
30

C#列表速度快吗?使用列表处理对象有什么好处和坏处?C#列表的速度

广泛使用列表会使软件变慢吗?什么是C#中的列表的替代品?

列表中“对象太多”的对象有多少?

+3

这实际上取决于你想要对他们做什么。 – LukeH 2009-09-16 14:28:35

+10

“快”和“慢”是无关紧要的。相关的“对我的客户足够快”和“对我的客户来说太慢”。你的第一个问题应该是“列表速度够快吗?”你是唯一知道你的客户是谁以及他们的性能要求是什么的人,所以只有你*能够回答这个问题。您将通过尝试一些有意义的基准并将它们与您仔细陈述的以客户为中心的实际目标进行比较来回答。 – 2009-09-16 14:45:44

回答

77

List<T>使用的背衬数组来保存项目:

  • 索引器访问(即取/更新)为O(1)
  • 从尾部删除是O(1)
  • 从别处需要删除现有的项目需要向上移动,所以O(n)有效
  • 除非需要调整大小,否则它是O(n)。 (这使缓冲区大小加倍,所以分摊成本为O(1)。)
  • 添加到其他位置需要将现有项目向下移位,因此O(n)有效
  • 查找项目是O(n ),除非它被分类,在这种情况下二分搜索给出了O(log n)

通常很好地使用列表相当广泛。如果在开始填充列表时知道最终大小,最好使用允许指定容量的构造函数,以避免调整大小。除此之外:如果你担心,打破探查器...

+0

Brian修复了它 - 谢谢Brian :) – 2009-09-16 14:33:12

+0

“添加到结尾”甚至累积了O(1) – 2009-09-16 14:58:24

+0

的费用@Thomas:是的,我会提到这一点。 – 2009-09-16 15:16:23

12

比较什么?

  • 如果你的意思是List<T>,那么这本质上是一个数组的包装;如此快速的索引读/写,相对快速追加(因为它允许额外的空间,在必要时大小增加一倍),并从最后删除,但更昂贵的做其他操作(插入/删除除的端部)
  • 阵列再次是快速通过索引,但固定的大小(无附加/删除)
  • Dictionary<,>等提供由密钥

列表本质上不是慢更好的访问;特别是如果你知道你总是需要查看所有数据,或者可以通过索引访问它。但对于大型列表来说,通过密钥进行搜索可能会更好(也更方便)。 .NET中有各种各样的字典实现,每种字典都具有不同的大小/性能成本。