【发布时间】:2013-06-24 13:13:18
【问题描述】:
如果您需要在一台机器上的 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 Timer 用于此类用例,因为您必须以最小的开销快速安排任务,即 O(1) 用于新任务。 您还将最小化记账活动,因为您将获得更少的滴答数(N
有人尝试过这些计时器来进行类似的活动吗?在实践中看到了什么结果? 谢谢!
【问题讨论】:
-
它们之间的根本区别在于,HWT 针对调度进行了优化,具有对时序不精确的容忍度。如果你能忍受它的不精确,那么它几乎肯定是更好的选择。
-
谢谢,是的,吞吐量(比如每秒)对我来说比单个任务的准确调度更重要。另一方面,我怀疑 STPE 在繁重的负载和巨大的工作队列上会非常准确。在这种情况下,调整刻度大小后,您可能会获得更准确的 HWT。
标签: java timer netty executorservice stress-testing