10

如果您需要在一台机器上的 jvm 内尽可能快地安排大量(非阻塞)任务,我正在考虑使用什么计时器实现。

我已经研究ScheduledThreadPoolExecutorHashedWheelTimer来源(+wheel timer general docs),这是基本的区别(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 Timer 用于此类用例,因为您必须以最小的开销快速安排任务,即 O(1) 用于新任务。您还将最小化簿记活动,因为您将获得更少的滴答数(N < C)和更少的锁定争用。在这种情况下,取消不是很重要的功能

有没有人为类似的活动尝试过这些计时器?在实践中看到了什么结果?谢谢!

4

1 回答 1

2

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

实际上,如果你需要那个级别的精度,你需要一个有保证的中断时间而不是 GC 暂停的系统;即不是Java,不是英特尔... :)

于 2015-06-17T22:21:04.347 回答