【问题标题】:Most suitable .net Timer for a scheduler最适合调度程序的 .net 计时器
【发布时间】:2009-11-24 15:31:10
【问题描述】:

我们在代码中使用CCR timers 确定了一个热点。看来,如果我们将数千个计时器排入队列,代码就会出现终端速度下降。

解决方法是选择最快的计划项目并将此事件的计时器排入队列。当它触发时,我们重复。通过这种方式,我们一次只能将一个计时器间隔排入队列。

我们现在发现的是,我们用来管理计划项目的 SortedList 实例正在随着列表中删除的重量而燃烧。

是否所有的 .net 计时器都会遇到 CPU 使用率随着排队的项目数量增加而增加的问题,或者是否有一个更智能的编写方式。

或者,是否有更合适的数据结构来保持我们的计划项目有序,支持从列表前面快速插入和快速删除?

【问题讨论】:

    标签: c# .net scheduling timer


    【解决方案1】:

    排序列表使用下面的数组,因此从列表前面删除是最慢的操作之一。以相反的顺序排序将减少从列表中删除项目所需的时间,因为您将从末尾删除。

    如果您只关心下一项,Priority Queue 可能是一个不错的选择。

    【讨论】:

      【解决方案2】:

      听起来您需要使用优先级队列。 Priority queues 通常用堆实现,但我发现 skip lists 往往效果更好。不幸的是,BCL 没有内置优先级队列,因此您必须自己编写或在其他地方找到一个。 SortedList 会扼杀你的表现。即使您决定不使用优先级队列,也可能通过改用 SortedDictionary 来获得快速提升。

      编辑: 我在这里更喜欢优先级队列而不是 SortedDictionary 的原因是,SortedDictionary 中最低键的删除是 O(log(n)) 而不是 O( 1) 用于优先队列。

      【讨论】:

      • 从 PQ 中移除是 O(log n)。从 SortedList 中删除可能是 O(n)
      • 从 PQ 中删除的平均案例肯定是 O(log(n))。但是 OP 会对 O(1) 的最低密钥删除更感兴趣。是的,SortedList 删除是 O(n),这对于这种类型的场景来说非常缓慢。
      【解决方案3】:

      对于可能(或可能不够)足够的快速修复,请切换到排序字典。

      排序列表会导致问题,因为它的底层数据结构是一个数组。正如另一位海报指出的那样,如果您从排序列表的“顶部”([0])中删除,则所有其他项目都必须在数组中向下移动一个,因此列表中的项目越多,昂贵的是删除一个。 (所以性能是 O(n) 或更差)。

      相反,排序字典上的插入和删除是 O(log n),因此当列表中有很多项目时,删除性能的影响应该小得多。

      【讨论】:

        【解决方案4】:

        尝试使用LinkedList<T>,我相信您会看到性能的巨大提升。它非常适合快速添加和删除。

        【讨论】:

        • 但是他必须手动进行排序,这对于他的特殊情况来说可能还不错,所以这是一个不错的选择。
        • 我正在研究调度程序的用法。我的信念是所有项目都按时间顺序提交,所以这可能确实是最好的解决方法。
        【解决方案5】:

        要始终获得最快的预定项目,您需要使用 Heap,而不是 SortedList。

        标准 .Net 库中没有堆。您可以从here 下载实现或自行开发。

        【讨论】:

          【解决方案6】:

          如果您绝对需要排序功能,您可以考虑使用 SortedDictionary 而不是 SortedList。 SortedDictionary 是 O(log n) 的插入和 remonal,因为它在内部使用树。

          http://msdn.microsoft.com/en-us/library/5z658b67(VS.80).aspx

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 1970-01-01
            • 2011-06-13
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2017-06-04
            • 2016-08-05
            相关资源
            最近更新 更多