1 台のマシンの jvm 内で大量の (非ブロッキング) タスクをできるだけ速くスケジュールする必要がある場合に使用するタイマーの実装を考えています。
ScheduledThreadPoolExecutor
ソース (+ホイール タイマーの一般的なドキュメント)を調べましHashedWheelTimer
たが、ここに基本的な違いがあります (N - これまでにスケジュールされたすべての未解決のタスクの数、C - ホイール サイズ):
ScheduledThreadPoolExecutor
- 新しいタスクを追加するための O(log N)
- 各タイマーティックごとに O(1) (ただし、各タスクごとにティックするため、全体で N)
- O(log N) タスクのキャンセル
- 各ティック/タスクごとにロック
ハッシュドホイールタイマー
- O(1) 新しいタスクの追加
- 各タイマー ティックごとに O(m) (m ~ N/C ここで C > 512 約)、全体で ~C ティック
- タスクをキャンセルするための O(m)
- タスクのバケットごとにロック (ティックごと)
したがって、私はこのようなユースケースに HW タイマーを使用する傾向があります。これは、新しいタスクの O(1) など、最小限のオーバーヘッドでタスクをすばやくスケジュールする必要があるためです。また、ティックの数が少なくなり (N < C)、ロックの競合が少なくなるため、ブックキーピング アクティビティを最小限に抑えることができます。この場合、キャンセルはそれほど重要な機能ではありません
誰かが同様の活動のためにこれらのタイマーを試しましたか?実際にどのような結果が見られますか? ありがとう!