1

我有一个应用程序将从 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?

我的问题是:

  • 基本上,我正在使用该解决方案的字典来寻找内存或性能方面的缺陷。运行它的机器没有太多内存,但吞吐量性能的优先级略高。
  • 如果这个应用程序整天运行,在使用字典时会不会有任何内存相关的问题?
  • 有没有人对此过程或替代实施有任何想法。我必须决定一个设计,但我无法测试不同的性能解决方案,因为我没有足够的时间,所以我想在开始之前尝试收集一些想法和实现想法的优点。
4

2 回答 2

1

我认为字典不在这里,不是因为记忆问题,而是因为它没有多大意义。我会使用排序列表,其中很容易删除第一个元素,也很容易在中间添加元素。

字典没有“第一”的概念。

内存消耗会差不多(数据会占用大部分内存,而不是字典或列表的开销),列表的性能会更好。

您对数据结构的操作是:在缓冲区的末尾添加一个数据包,从缓冲区的开头删除一个缓冲区,如果缺少数据包,停止所有操作,请求重新传输,然后添加它 - 可能到缓冲区的开头(因为这就是您意识到数据包丢失的方式)。

.NET 列表实际上是通过数组实现的,这不是最佳选择,但您可以使用 LinkedList - 这非常适合您的需要。

于 2012-02-23T08:39:21.223 回答
0

我最终决定用字典支持它来实现我自己的队列。

Dictionary 提供了我正在寻找的插入和删除性能,过早地考虑太多小的性能问题不会让我一事无成。

只跟踪最低的数字就可以了,我不会进一步详细说明。

于 2012-03-10T17:47:46.417 回答