1台のマシンでjvm内でできるだけ早くたくさんの(非ブロッキング)タスクをスケジュールする必要がある場合に、使用するタイマーの実装を考えています。高性能のためにHashedWheelTimerとScheduledThreadPoolExecutorを比較する
私はScheduledThreadPoolExecutor
とHashedWheelTimer
源(+ホイールタイマーの一般的なドキュメント)を学び、ここにある基本的な違い(N - すべての未処理のスケジュールされたタスクの数、これまで、C - ホイールサイズ)しました:
のScheduledThreadPoolExecutor
- O(Nログ)
- O(1)各タイマーティックごと
- O(ただし、そうN全体として、各タスクごとティック)(ログN)C新しいタスクを追加するため
- O HashedWheelTimer各ティック/タスク
当たりタスク
- ロックancelling(1)各タイマーティック(M〜N /あたり新しいタスク
- O(M)を添加C C> 512)〜C ticks overall
- タスクをキャンセルするためのO(m)
- タスクのバケットごとのロック(各ダニで)
このように、新しいタスクでは最小限のオーバーヘッド、つまりO(1)ですばやくタスクをスケジュールする必要があるため、このような場合はHW Timerを使用する傾向があります。 また、ティック(N < C)の数が少なくなり、ロック競合が少なくなるため、簿記アクティビティを最小限に抑えることができます。 このケースでは、取り消しはあまり重要ではありません。
誰もこのような活動のためにこれらのタイマーを試してみましたか? ありがとう!
これらの基本的な違いは、HWTがタイミングの不正確さに対する許容性を備えたスケジューリングに最適化されていることです。あなたがその不正確さで生きることができれば、それはほぼ確実に良い選択です。 –
ありがとうございます。はい、個々のタスクの正確なスケジューリングよりもスループット(1秒あたり)が重要です。一方、STPEは、重い負荷や巨大なワークキューでは非常に正確であるとは思えません。この場合、ティックサイズを調整した後、HWTをより正確に取得することができます。 – yetanothercoder