HashedWheelTimer против ScheduledThreadPoolExecutor для повышения производительности

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

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


person yetanothercoder    schedule 24.06.2013    source источник
comment
Принципиальное различие между ними состоит в том, что HWT оптимизирован для планирования с допуском на неточность синхронизации. Если вы можете жить с его неточностью, то это почти наверняка лучший выбор.   -  person Marko Topolnik    schedule 24.06.2013
comment
Спасибо, да, для меня важнее пропускная способность (скажем, в секунду), чем точное планирование отдельных задач. С другой стороны, я сомневаюсь, что STPE будет очень точным при большой нагрузке и огромной очереди работы. И в этом случае вы можете получить более точный HWT после настройки размера тика.   -  person yetanothercoder    schedule 24.06.2013


Ответы (1)


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

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

person Chris Mowforth    schedule 17.06.2015