Я понимаю, что использовать таймер, если вам нужно запланировать множество (не блокирующих) задач как можно быстрее внутри jvm на одной машине.HashedWheelTimer vs ScheduledThreadPoolExecutor для повышения производительности
Я изучал ScheduledThreadPoolExecutor
и HashedWheelTimer
источников (+ колесо таймер общие документы), и здесь основные отличия (N - количество всех невыполненных запланированных задач до сих пор, C - размер колеса):
ScheduledThreadPoolExecutor
- O (N журнал) для добавления новой задачи
- O (1) за каждый тик таймера (но отметьте по каждой задаче, так что общая Н)
- O (журнал N), с ancelling задачу
- замок на каждый тик/задачи
HashedWheelTimer
- O (1) добавление новой задачи
- O (м) на каждый тик таймера (м ~ Н/C, где C> 512 приблизительно), поэтому ~ C галочки в целом
- O (m) для отмены задачи
- блокировка на каждое задание (по каждому тику)
Таким образом, я стараюсь использовать HW Timer для такого прецедента, потому что вы должны быстро планировать задачи с минимальными накладными расходами, то есть O (1) для новой задачи. Также вы минимизируете бухгалтерскую деятельность, потому что вы получите меньшее количество тиков (N < C) и меньше разводов. Отмена не очень важная функция в этом случае
Пробовал ли кто-нибудь эти таймеры для подобных мероприятий и какие результаты видны на практике? Спасибо!
Принципиальное различие между ними заключается в том, что HWT оптимизирован для планирования с допуском для неточности синхронизации. Если вы можете жить с его неточностями, то это, безусловно, лучший выбор. –
Спасибо, да, пропускная способность (скажем, в секунду) важнее для меня, чем точное планирование задач. С другой стороны, я сомневаюсь, что STPE будет очень точной по тяжелой нагрузке и с огромной рабочей очередью. И вы можете получить HWT более точным после настроенного размера галочки в этом случае. – yetanothercoder