2013-06-24 73 views
8

如果您需要在一臺機器上儘可能快地在jvm中安排大量(非阻塞)任務,我計算出要使用的計時器實現。HashedWheelTimer vs ScheduledThreadPoolExecutor以獲得更高性能

我研究ScheduledThreadPoolExecutorHashedWheelTimer源(+輪定時器通用文檔),這裏是基本的差異(N - 的所有懸而未決的計劃任務數到目前爲止,C - 輪轂尺寸):

的ScheduledThreadPoolExecutor

  • 爲O(log N)用於添加新任務
  • O(1)每每個計時器滴答(但每每個任務剔,所以總N)
  • O(日誌N)C ancelling任務
  • 每每個刻度/任務

HashedWheelTimer

  • O(1)添加新的任務
  • ö每每個計時器滴答(m個(m)〜N/C,其中C> 512約),所以〜C滴答整體
  • O(m)取消任務
  • 鎖定每桶任務(在每個滴答)

因此,我傾向於使用HW Timer來處理這種用例,因爲您必須以最小的開銷快速安排任務,即O(1)用於新任務。 此外,您還可以最大限度地減少簿記活動,因爲您可以獲得更少的剔號(N < C)並減少爭用鎖。 在這種情況下取​​消並不是非常重要的功能

有沒有人試過這些計時器進行類似的活動,並在實踐中看到什麼結果? 謝謝!

+1

它們之間的根本區別在於,HWT針對時序不精確性容差進行了優化。如果你能忍受它的不精確,那麼它幾乎肯定是更好的選擇。 –

+0

謝謝,是的,吞吐量(比如說每秒)對於我來說比單獨的任務精確調度更重要。另一方面,我懷疑STPE在重載和龐大的工作隊列方面會非常準確。在這種情況下,您可以在調整刻度大小後使HWT更加準確。 – yetanothercoder

回答

0

HWT。除非您需要使用ns-precision,否則請使用HWT。對於大多數客戶端服務器應用程序,HWT就足夠了。在許多互聯網規模的應用程序中,特別是對於超時時間不斷變化的內存緩存,這是唯一的選擇。我們在這裏談論數十億個工作。實際上,如果你需要這樣的精度水平,你需要一個保證中斷時間而不是GC暫停的系統;即不是Java,而不是Intel ... :)

相關問題