队列 VS名单 (Queue vs List)

2019-06-24 01:24发布

我目前使用一个List<T>作为一个队列(使用lst[0]然后lst.removeAt(0)来保存对象。 有大约20项最高在给定时间。 我意识到有一个实际的Queue<T>类。 我不知道是否有任何好处(性能,存储器等)来使用Queue<T>List<T>像个队列?

Answer 1:

性能可以异形。 虽然在这种情况下这么几个项目,您可能需要运行的代码数百万次真正得到有价值的差异。

我要说的是: Queue<T>将更加明确地暴露你的意图的人都知道队列是如何工作的。

使用像一个队列列表并不清晰,尤其是如果你有很多不必要的索引和RemoveAt(magicNumber)代码。 Dequeue是从一个代码,维修点多了很多耗材。

如果这则让你衡量性能问题,则可以解决这个问题。 不解决每一个潜在的性能问题放在首位。



Answer 2:

简短的回答:
Queue<T>快于List<T>时,它的使用像一个队列。 List<T>快于Queue<T>像列表一起使用时。

长一点的回答:
Queue<T>为出队操作,这是一个O(1)的操作速度更快。 所述阵列的后续项的整个块不向上移动。 这是可能的,因为一个Queue<T>不需要便于从随机位置的去除,但只有从顶部。 因此,保持头部(从该项目是在拉Dequeue )和尾部位置(这是该项目在添加Enqueue )。 在另一方面从顶部除去List<T>需要本身转移以后每一个项目向上的位置。 这是O(n) - 最坏的情况下,如果你从上面,这是一列操作就是删除。 如果你在一个循环中出队的速度优势可以显着。

一个List<T>是更好的性能,如果你需要索引访问,随机检索等。 Queue<T>将枚举完全找到合适的索引位置(它不公开IList<T>

这就是说,一个Stack<T> VS List<T>非常接近,有在推动和弹出操作的性能差异。 他们都推到另一端,从阵列结构的端部除去(这两者都是O(1))。


当然,你应该使用正确的结构,揭示了意向。 在大多数情况下,因为它们是量身定做的目的,他们将执行更好。 我相信,有没有一直没有性能差异可言,微软就不会列入Queue<T>Stack<T>在仅仅不同的语义框架。 这本来是简单的易于扩展的,如果是这样的话。 认为约SortedDictionary<K, V>SortedList<K, V>这两者做同样的,但仅由性能特性鉴别; 他们发现在BCL的地方。



Answer 3:

除此之外的事实Queue<T>类实现一个队列和List<T>类实施一个列表是有性能差异。

每次删除从第一元件List<T>队列中的所有元素被复制。 与队列中只有20个元素可能不是显着的。 但是,当从出列的下一个元素Queue<T>没有这种复制正在发生,并且总是会更快。 如果队列很长的差异可能显著。



Answer 4:

我想强调的HugoRune已经指出。 Queue比显著快List ,其中存储器访问是1nList在这种使用情况。 我有一个类似的用例,但我有数百个值的,我会用Queue ,因为它是一个数量级的速度更快。

有关的说明Queue正在对的基础上实现List :关键词是“执行”。 它不会在出队的每一个值复制到新的存储位置,而使用循环缓冲区。 这可以在“顶部进行List ”没有这种直接使用拷贝的处罚List暗示。



文章来源: Queue vs List