我正在考虑在jvm上使用什么计时器实现,如果需要尽可能快地安排大量(非阻塞)任务。我研究了ScheduledThreadPoolExecutor和HashedWheelTimer的源代码(以及关于wheel timer的一般文档),以下是它们的基本区别(其中N为迄今为止所有未完成的计划任务数量,C为轮子大小):
ScheduledThreadPoolExecutor:
添加新任务的O(log N) 每个计时器滴答的O(1)(但每个任务都要计时,因此总共N个) 取消任务的O(log N) 每个滴答或任务锁定
HashedWheelTimer:
添加新任务的O(1) 每个计时器滴答的O(m)(m ≈ N/C,其中C > 512左右),因此总共有~C个滴答 取消任务的O(m) 每个滴答周期内对任务存储桶进行锁定
因此,我倾向于在这种情况下使用HW计时器,因为您必须快速地安排任务并尽量减少开销,即新任务为O(1)。此外,由于您将获得更少的滴答数(N < C)和更少的锁争用,因此您将最小化簿记活动。在这种情况下,取消不是非常重要的功能。
是否有人尝试过类似活动的这些计时器,并取得了什么样的结果?谢谢!
ScheduledThreadPoolExecutor:
添加新任务的O(log N) 每个计时器滴答的O(1)(但每个任务都要计时,因此总共N个) 取消任务的O(log N) 每个滴答或任务锁定
HashedWheelTimer:
添加新任务的O(1) 每个计时器滴答的O(m)(m ≈ N/C,其中C > 512左右),因此总共有~C个滴答 取消任务的O(m) 每个滴答周期内对任务存储桶进行锁定
因此,我倾向于在这种情况下使用HW计时器,因为您必须快速地安排任务并尽量减少开销,即新任务为O(1)。此外,由于您将获得更少的滴答数(N < C)和更少的锁争用,因此您将最小化簿记活动。在这种情况下,取消不是非常重要的功能。
是否有人尝试过类似活动的这些计时器,并取得了什么样的结果?谢谢!