2013-06-24 2 views
8

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

Пробовал ли кто-нибудь эти таймеры для подобных мероприятий и какие результаты видны на практике? Спасибо!

+1

Принципиальное различие между ними заключается в том, что HWT оптимизирован для планирования с допуском для неточности синхронизации. Если вы можете жить с его неточностями, то это, безусловно, лучший выбор. –

+0

Спасибо, да, пропускная способность (скажем, в секунду) важнее для меня, чем точное планирование задач. С другой стороны, я сомневаюсь, что STPE будет очень точной по тяжелой нагрузке и с огромной рабочей очередью. И вы можете получить HWT более точным после настроенного размера галочки в этом случае. – yetanothercoder

ответ

0

HWT. Если вам не нужна точность, используйте HWT. Для большинства клиент-серверных приложений достаточно HWT. Во многих интернет-приложениях, особенно для кэшей в памяти, которые были таймаутом, постоянно менялось, это был единственный вариант. Мы говорим о миллиардах рабочих мест здесь.

На самом деле, если вам требуется этот уровень точности, вам нужна система с гарантированным временем прерывания, а не GC-паузы; то есть не Java, а не Intel ... :)