【问题标题】:HashedWheelTimer vs ScheduledThreadPoolExecutor for higher performanceHashedWheelTimer vs ScheduledThreadPoolExecutor 以获得更高的性能
【发布时间】:2013-06-24 13:13:18
【问题描述】:

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

我研究了ScheduledThreadPoolExecutorHashedWheelTimer 来源(+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 Timer 用于此类用例,因为您必须以最小的开销快速安排任务,即 O(1) 用于新任务。 您还将最小化记账活动,因为您将获得更少的滴答数(N

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

【问题讨论】:

  • 它们之间的根本区别在于,HWT 针对调度进行了优化,具有对时序不精确的容忍度。如果你能忍受它的不精确,那么它几乎肯定是更好的选择。
  • 谢谢,是的,吞吐量(比如每秒)对我来说比单个任务的准确调度更重要。另一方面,我怀疑 STPE 在繁重的负载和巨大的工作队列上会非常准确。在这种情况下,调整刻度大小后,您可能会获得更准确的 HWT。

标签: java timer netty executorservice stress-testing


【解决方案1】:

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

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

【讨论】:

    猜你喜欢
    • 2021-04-17
    • 2014-07-22
    • 1970-01-01
    • 1970-01-01
    • 2023-04-03
    • 2013-09-21
    • 2014-06-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多