2013-05-08 50 views
0

有幾千個運行Timer對象(通過調用Reactive RX的Observable.Interval擴展方法在幕後產生),是否有任何性能考慮?這將用於服務器應用程序。可能同時運行的定時器的數量將是數千到數萬。運行Timer對象的性能損失1000?

+0

即使沒有1000個定時器做任何事情,只是坐在那裏按定期間隔打勾,在我看來,效率相當低。我不知道你的設計是什麼,但我很肯定有一個更好的方法來實現它,而不使用10,000個定時器。 – PoweredByOrange 2013-05-08 23:50:28

+0

我想創建一個通用的自動保存對象,並且每個對象都會間隔保存。更清潔的設計,但如果有一個性能的影響...... – Arash 2013-05-09 00:18:20

+1

考慮編程它,就好像你有1000個定時器,但實現一個自定義的調度程序,實際使用一個,並處理邏輯計時器的答案建議。只是一個想法。 – 2013-05-09 00:39:03

回答

1

論壇的迴應儘管如此,答案大概是非常平常的!

我建議你做一個壺咖啡和讀到這裏巴特迪斯的博客文章:http://blogs.msdn.com/b/rxteam/archive/2012/06/20/reactive-extensions-v2-0-release-candidate-available-now.aspx

總之,你實際上並沒有創建Timer對象,當您使用Observable.Interval,實際上發生了什麼高效 - 但是,確切的行爲是相當涉及和非常值得理解。

編輯:我已經做了一些關於此接下來在Rx論壇反訴的詳細分析。請參閱此處進行更全面的討論:http://social.msdn.microsoft.com/Forums/en-US/rx/thread/13227561-deaa-4984-a52e-601b8a9f8e14

短版本 - 當10秒鐘時間到達時間爲<時,您將獲得新的計時器,否則將使用單個計時器。

+0

將您的評論標記爲答案,因爲它提供了更深入的鏈接!謝謝詹姆斯 – Arash 2013-05-21 21:32:14

1

請不要。最好添加到帶有過期時間戳的列表並使用f.e.一個線程來處理列表。

0

您會注意到的最明顯的情況是,可以同時處理的計時器事件的數量受CPU內核數量的限制。如果同時觸發太多的事件,他們將排隊等待並可能處理相當長的時間。另外,如果同時啓動了太多的線程,上下文切換會導致很多開銷,所以處理程序運行速度會很慢,無論是從開銷還是很多線程需要劃分的事實增加CPU時間。

請考慮您是否可以運行一個定時器,並讓它處理一系列邏輯定時器。

1

我問了關於Reactive論壇的問題 - 聽起來像是100%可以這樣做。 This is the answer

在這裏引用一下,得到的答覆是:

從內存中有一個單獨的線程,它處理的計時和有一個跟蹤所有預定觀測的一個優先級堆。它的比例非常好。因此,即使有成千上萬的查詢,您也只有一個實際的計時器和一個實際的線程來管理它們。

+0

請參閱我的答案中引用的博文,瞭解更多信息。 Rx版本之間的行爲發生了很大變化。 – 2013-05-13 09:59:22