HashedWheelTimer vs ScheduledThreadPoolExecutor für höhere Leistung

8

Ich überlege, was eine Timer-Implementierung zu verwenden ist, wenn Sie innerhalb von jvm auf einer Maschine so viele (nicht blockierende) Aufgaben wie möglich planen müssen.

Ich habe ScheduledThreadPoolExecutor und HashedWheelTimer sources (+ rad timer general docs) studiert und hier sind grundlegende Unterschiede (N - Anzahl aller ausstehenden geplanten Aufgaben, C - Radgröße):

ScheduledThreadPoolExecutor

  • O (log N) zum Hinzufügen einer neuen Aufgabe
  • O (1) für jeden Timer-Tick (aber Tick für jeden Task, also N overall)
  • O (log N) Abbrechen der Aufgabe
  • Sperre für jeden Tick / Aufgabe

HashedWheelTimer

  • O (1) neue Aufgabe hinzufügen
  • O (m) für jeden Zeitgeber-Tick (m ~ N / C, wobei C & gt; 512 approximativ ist), also ~ C tickt insgesamt
  • O (m) zum Abbrechen einer Aufgabe
  • Sperre pro Aufgabenbereich (bei jedem Tick)

Daher verwende ich HW Timer für einen solchen Anwendungsfall, weil Sie Aufgaben schnell mit minimalem Aufwand planen müssen, d. h. O (1) für neue Aufgabe. Außerdem werden Sie eine Buchhaltungsaktivität minimieren, da Sie eine geringere Anzahl an Ticks (N & lt; C) und weniger Sperrkonflikte erhalten. Das Abbrechen ist in diesem Fall nicht sehr wichtig.

Hat jemand diese Timer für ähnliche Aktivitäten getestet und welche Ergebnisse sieht man in der Praxis? Danke!

    
yetanothercoder 24.06.2013, 13:13
quelle

1 Antwort

0

HWT . Wenn Sie nicht die Genauigkeit von -n -s benötigen, verwenden Sie das HWT. Für die meisten Client-Server-Anwendungen reicht ein HWT aus. In vielen Anwendungen im Internet, insbesondere für In-Memory-Caches, deren Timeout sich ständig änderte, war dies die einzige Option. Wir reden hier über Milliarden von Arbeitsplätzen.

Wenn Sie diese Präzisionsstufe benötigen, benötigen Sie ein System mit garantierten Unterbrechungszeiten und nicht GC-Pausen. d. h. nicht Java, nicht Intel ...:)

    
Chris Mowforth 17.06.2015 22:21
quelle