我目前使用一个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
,其中存储器访问是1
与n
为List
在这种使用情况。 我有一个类似的用例,但我有数百个值的,我会用Queue
,因为它是一个数量级的速度更快。
有关的说明Queue
正在对的基础上实现List
:关键词是“执行”。 它不会在出队的每一个值复制到新的存储位置,而使用循环缓冲区。 这可以在“顶部进行List
”没有这种直接使用拷贝的处罚List
暗示。