拥有数千个正在运行的 Timer 对象(通过调用 Reactive RX 的 Observable.Interval 扩展方法在幕后产生)是否有任何性能考虑?这将用于服务器应用程序。可能同时运行的计时器的数量将是数千到数万。
4 回答
请不要。最好添加到带有过期时间戳的列表中,并使用 fe 线程来处理列表。
尽管有论坛的回应,但答案是非常重要的!!!
我建议你煮一大壶咖啡,然后在这里阅读 Bart de Smet 的博客文章:http: //blogs.msdn.com/b/rxteam/archive/2012/06/20/reactive-extensions-v2-0-release-候选人-available-now.aspx
简而言之,当您使用 Observable.Interval 时,您实际上并没有创建 Timer 对象,实际发生的事情是有效的 - 但是,精确的行为非常复杂,非常值得理解。
编辑:在 Rx 论坛上提出反诉之后,我对此进行了一些详细的分析。请参阅此处进行更全面的讨论:http ://social.msdn.microsoft.com/Forums/en-US/rx/thread/13227561-deaa-4984-a52e-601b8a9f8e14
短版 - 当到期时间小于 10 秒时,您将获得新的计时器,否则将使用单个计时器。
我在 Reactive 论坛上问了这个问题——听起来这样做是 100% 可以的。 这是答案
在这里引用它,答案是:
在内存中,有一个线程来处理时间,并且有一个优先级堆来跟踪所有调度的 observables。它的扩展性非常好。因此,即使有数以万计的
Observable.Interval
查询,您也只有一个实际的计时器和一个实际的线程来管理这一切。
您会注意到的最明显的事情是,可以同时处理的计时器事件的数量受到 CPU 内核数量的限制。如果同时触发太多事件,它们将被排队并且可能会以相当大的延迟进行处理。
此外,如果同时启动了太多线程,上下文切换会带来很多开销,因此处理程序会运行缓慢,这既来自开销,也来自于这么多线程需要分配 CPU 时间的事实.
考虑是否可以运行单个计时器,并让它处理逻辑计时器列表。