HashedWheelTimer与ScheduledThreadPoolExecutor具有更高的性能

yet*_*der 9 java timer stress-testing executorservice netty

我想知道如果你需要在一台机器上的jvm中尽可能快地安排大量(非阻塞)任务,那么使用什么定时器实现.

我已经研究ScheduledThreadPoolExecutorHashedWheelTimer来源(+轮定时器通用文档),这里是基本的差异(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)用于取消任务
  • 锁定每桶任务(每个滴答)

因此,我倾向于将硬件计时器用于这种用例,因为您必须以最小的开销快速安排任务,即O(1)用于新任务.此外,您将最大限度地减少簿记活动,因为您将获得更少的刻度(N <C)和更少的锁争用.在这种情况下,取消不是非常重要的特征

是否有人尝试过这些计时器进行类似的活动以及实际看到的结果?谢谢!

Chr*_*rth 3

健康水处理。除非您需要 ns 精度,否则请使用 HWT。对于大多数客户端-服务器应用程序,HWT 就足够了。在许多互联网规模的应用程序中,特别是对于超时不断变化的内存缓存,这是唯一的选择。我们在这里谈论的是数十亿个就业岗位。

实际上,如果您需要这种精度,您需要一个具有保证中断时间而不是 GC 暂停的系统;即不是 Java,不是 Intel...:)