如果您需要在一臺機器上儘可能快地在jvm中安排大量(非阻塞)任務,我計算出要使用的計時器實現。HashedWheelTimer vs ScheduledThreadPoolExecutor以獲得更高性能
我研究ScheduledThreadPoolExecutor
和HashedWheelTimer
源(+輪定時器通用文檔),這裏是基本的差異(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)並減少爭用鎖。 在這種情況下取消並不是非常重要的功能
有沒有人試過這些計時器進行類似的活動,並在實踐中看到什麼結果? 謝謝!
它們之間的根本區別在於,HWT針對時序不精確性容差進行了優化。如果你能忍受它的不精確,那麼它幾乎肯定是更好的選擇。 –
謝謝,是的,吞吐量(比如說每秒)對於我來說比單獨的任務精確調度更重要。另一方面,我懷疑STPE在重載和龐大的工作隊列方面會非常準確。在這種情況下,您可以在調整刻度大小後使HWT更加準確。 – yetanothercoder