Я прикидываю, какую реализацию таймера использовать, если вам нужно как можно быстрее запланировать тонны (неблокирующих) задач внутри jvm на одной машине.
Я изучил ScheduledThreadPoolExecutor
и HashedWheelTimer
источники (+ общие документы таймера колеса), и вот основные отличия (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) и меньше конфликтов блокировок. Отмена в данном случае не очень важная функция
Кто-нибудь пробовал эти таймеры для подобных занятий и какие результаты видит на практике? Спасибо!