10

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)、ロックの競合が少なくなるため、ブックキーピング アクティビティを最小限に抑えることができます。この場合、キャンセルはそれほど重要な機能ではありません

誰かが同様の活動のためにこれらのタイマーを試しましたか?実際にどのような結果が見られますか? ありがとう!

4

1 に答える 1

2

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

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

于 2015-06-17T22:21:04.347 に答える