2013-06-24 7 views
8

1台のマシンでjvm内でできるだけ早くたくさんの(非ブロッキング)タスクをスケジュールする必要がある場合に、使用するタイマーの実装を考えています。高性能のためにHashedWheelTimerとScheduledThreadPoolExecutorを比較する

私はScheduledThreadPoolExecutorHashedWheelTimer源(+ホイールタイマーの一般的なドキュメント)を学び、ここにある基本的な違い(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)の数が少なくなり、ロック競合が少なくなるため、簿記アクティビティを最小限に抑えることができます。 このケースでは、取り消しはあまり重要ではありません。

誰もこのような活動のためにこれらのタイマーを試してみましたか? ありがとう!

+1

これらの基本的な違いは、HWTがタイミングの不正確さに対する許容性を備えたスケジューリングに最適化されていることです。あなたがその不正確さで生きることができれば、それはほぼ確実に良い選択です。 –

+0

ありがとうございます。はい、個々のタスクの正確なスケジューリングよりもスループット(1秒あたり)が重要です。一方、STPEは、重い負荷や巨大なワークキューでは非常に正確であるとは思えません。この場合、ティックサイズを調整した後、HWTをより正確に取得することができます。 – yetanothercoder

答えて

0

HWT。 -ns-precisionが必要な場合を除き、HWTを使用してください。ほとんどのクライアントサーバーアプリケーションでは、HWTで十分です。多くのインターネット規模のアプリケーション、特にタイムアウトが絶えず変化していたメモリ内のキャッシュでは、これが唯一の選択肢でした。ここ数十億の仕事について話しています。

実際に、その精度が必要な場合は、GC休止時間ではなく、割り込み時間が保証されたシステムが必要です。つまり、Javaではなく、Intelではありません。:)

関連する問題