HashedWheelTimer与ScheduledThreadPoolExecutor,哪个性能更高?

10
我正在考虑在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计时器,因为您必须快速地安排任务并尽量减少开销,即新任务为O(1)。此外,由于您将获得更少的滴答数(N < C)和更少的锁争用,因此您将最小化簿记活动。在这种情况下,取消不是非常重要的功能。
是否有人尝试过类似活动的这些计时器,并取得了什么样的结果?谢谢!

1
它们之间的根本区别在于HWT针对具有时间不精确性的调度进行了优化。如果您可以接受其不精确性,那么它几乎肯定是更好的选择。 - Marko Topolnik
谢谢,是的,对我来说吞吐量(例如每秒)比单个任务精确调度更重要。另一方面,我怀疑STPE在负载较重和工作队列巨大时会非常准确。在这种情况下,调整时钟周期后,你可能会得到更准确的HWT。 - yetanothercoder
1个回答

3

HWT。除非您需要纳秒级别的精度,否则请使用HWT。对于大多数客户端服务器应用程序,HWT已经足够了。在许多互联网规模的应用程序中,特别是对于内存缓存,其中超时时间不断变化的情况下,它是唯一的选择。我们在这里谈论的是数十亿个作业。

如果您需要那种级别的精度,则需要具有保证中断时间而不是GC暂停的系统;即不是Java,也不是Intel... :)


请详细说明“需要一个具有保证中断时间的系统不是英特尔”。 - Shashank

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接