我有一个应用程序将从udp连接读取有序数据包。这些消息需要以某种形式的缓冲区存储,其序列号用于查找。
这个'缓冲区'由另一个删除消息并处理它的线程提供服务。如果错过了序列号,我已停止服务线程,然后在另一个TCP连接上重新请求该消息。一旦它到达,我想将它重新放回缓冲区,服务线程可以继续。
所以我需要:按键插入,按最低键删除。密钥将是一个数字递增的数字,例如1,2,3,4,因此它可以更容易跟踪最高数字,因为密钥可以递增/递减,从而无需对数据结构进行排序。
My one plan is to use a Dictionary as the buffer, which makes for a simple solution
My other solution uses a set up two queues
Suggestion by zmbg to use SortedList - I am concerned about performance, as hashing would provide faster lookup and insert not?
我的问题是:
答案 0 :(得分:1)
我认为字典不在这里,不是因为内存问题,而是因为它没有多大意义。我会使用一个排序列表,它可以很容易地删除第一个元素,并且在中间添加元素也很容易。
字典没有“第一”的概念。
内存消耗量或多或少相同(数据将占用大部分内存,而不是字典或列表的开销),列表的性能会更好。
您对数据结构的操作是:在缓冲区末尾添加数据包,从缓冲区的开头删除缓冲区,如果丢失数据包,停止所有操作,请求重新传输,然后添加它 - 可能是缓冲区的开头(因为这就是你意识到数据包丢失的原因)。
.NET列表实际上是通过数组实现的,这不是最佳选择,但您可以使用LinkedList - 这非常适合您的需求。
答案 1 :(得分:0)
我最终决定用支持它的词典来实现我自己的队列。
Dictionary提供了我正在寻找的插入和删除性能,过早地考虑过小的性能问题并不会让我无处可去。
只跟踪最低数字是好的,我不会进一步详细说明。