最适合调度程序的.net计时器

时间:2009-11-24 15:31:10

标签: c# .net scheduling timer

我们已使用CCR timers在代码中找到了一个热点。看来,如果我们将数千个计时器排入队列,那么代码会受到终端减速的影响。

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

我们现在发现的是,我们用于管理计划项目的SortedList实例正在使用列表中删除的权重进行刻录。

所有.net计时器都会遇到CPU使用率增加的问题,排队的项目数量是多少,或者是否有更智能的写入。

或者,是否有更适合的数据结构,以便以有序的方式保留我们的预定项目,支持从列表前面快速插入和快速删除?

6 个答案:

答案 0 :(得分:4)

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

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

答案 1 :(得分:2)

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

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

答案 2 :(得分:1)

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

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

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

答案 3 :(得分:0)

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

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

答案 4 :(得分:0)

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

答案 5 :(得分:0)

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

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