一次定时器与三次定时器的性能比较

7
我对在我的.NET应用程序中使用System.Timers.Timer有一个问题。
我有三个不同的事件,一个每秒触发一次,另一个每分钟触发一次,最后一个每半小时触发一次。
从性能角度来看,使用一个计时器还是三个更好?
使用一个计时器的方法是检查ElapsedEventArgs的SignalTime并将其与先前测量的时间进行比较。当然,如果您已更改DateTime,则这不太适用,但这不是问题所在。基本上,每秒钟它过期一次,我会检查是否已经过去了一分钟或半小时...
我的担忧是使用3个计时器会创建太多开销。我错了吗?应该使用3个以获得简单和清晰,还是1个计时器就足够了?
代码:
private void TimerEverySecondElapsed(object sender, ElapsedEventArgs e)
    {
        timerEverySecond.Enabled = false;
        OnTimerElapsed(TimerType.EverySecond);

        // Raise an event every minute
        if ((e.SignalTime - previousMinute) >= minuteSpan)
        {
            OnTimerElapsed(TimerType.EveryMinute);
            previousMinute = e.SignalTime;
        }

        // Raise an event every half hour
        if ((e.SignalTime - previousHalfhour) >= semiHourSpan)
        {
            OnTimerElapsed(TimerType.EverySemiHour);
            previousHalfhour = e.SignalTime;
        }

        timerEverySecond.Enabled = true;
    }

minuteSpansemiHourSpan 是只读的 TimeSpan。


这并不是回答问题的方法,但另一个选项是使用两个计时器(一个用于秒,一个用于分钟/30分钟)。 - Rotem
只有你能回答这个问题:在性能上,一个计时器还是三个计时器更好?这是否是您应用程序的瓶颈? - Lukasz Madon
如果您只使用一个计时器(两个不会使您的代码变慢,您进行了性能分析吗?),那么性能不会受到任何可衡量的影响,并且您将节省三个计时器的开销(资源)。但是您需要考虑的是如何执行这些操作(如果您只使用一个计时器,则可能需要在池中运行它们,因为同步顺序执行可能会导致最后一个延迟太多)。 - Adriano Repetti
要说它会对性能产生多大影响,您需要像其他评论中所述一样对其进行分析(在我看来,它不会有影响)。拥有三个计时器将创建竞争条件,这可能会在以后成为一个非常棘手的问题。 - Leri
一个程序最多可以创建多少个定时器? - Arsen Mkrtchyan
@lukas 我进行了一些分析,发现大量时间都花费在ElapsedHandler上,但这可能是因为它还要检查其他事件是否需要被触发。我在某个地方读到过尽可能使用共享计时器,所以使用3个计时器可能更简单、更少出错。我会发布我的代码。 - Davio
3个回答

5

无论如何,都不会有太大的区别。无论计时器的数量如何,后台只有一个循环在运行。即使效率最低下,您也将使用线程池中的3个线程,但是可用的线程非常多,因此这并不重要。如果它使您的代码更易于阅读,我会建议您这样做。

但请记住,这仅适用于Threading.Timer(又名Timers.Timer)。Forms.Timer的行为有些不同,最好还是坚持其中之一,因为它仅在UI线程上运行,因此可能会遇到一些同步问题。

Threading.Timer vs. Forms.Timer

更多资源:

http://social.msdn.microsoft.com/Forums/en-US/netfxbcl/thread/f9a1c67d-8579-4baa-9952-20b3c0daf38a/

我能创建多少个System.Timers.Timer实例?我可以扩展到多远?


好的,我决定采用更易维护的三个计时器版本。 - Davio

0

相比于只有一个计时器,使用三个计时器几乎不会增加额外的开销,而且代码很可能会更好(在可读性和可维护性方面)。


0

我认为使用if判断比三个定时器的开销更大,另外如果试图使用一个定时器可能会遇到一些奇怪的情况。

我会选择使用三个定时器。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接