jjzjj

java - HashedWheelTimer vs ScheduledThreadPoolExecutor 以获得更高的性能

coder 2024-03-14 原文

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

我研究了 ScheduledThreadPoolExecutorHashedWheelTimer 来源(+wheel timer general docs),这里是基本差异(N - 到目前为止所有未完成的计划任务的数量,C - 车轮尺寸):

调度线程池执行器

  • O(log N) 添加新任务
  • 每个计时器滴答的时间复杂度为 O(1)(但每个任务滴答一次,所以总共有 N 个)
  • O(log N) 取消任务
  • 每个滴答/任务锁定

HashedWheelTimer

  • O(1) 添加新任务
  • O(m) 每个计时器滴答声(m ~ N/C,其中 C > 512 大约),所以 ~C 总体滴答声
  • O(m) 取消任务
  • 锁定每桶任务(在每个 tick 上)

因此我倾向于将 HW Timer 用于此类用例,因为您必须以最小的开销快速安排任务,即新任务的 O(1)。 此外,您还将最小化簿记 Activity ,因为您将获得更少的滴答数 (N < c)="" 和更少的锁争用。="">

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

最佳答案

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

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

关于java - HashedWheelTimer vs ScheduledThreadPoolExecutor 以获得更高的性能,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17276393/

有关java - HashedWheelTimer vs ScheduledThreadPoolExecutor 以获得更高的性能的更多相关文章

随机推荐