1

私の Ruby アプリケーションは、それぞれの実行に約 10 秒かかるジョブを処理します。各ジョブは、IO の待機に多くの時間を費やします。単純な Time.now 比較を使用して、ジョブの各段階にかかる時間を記録するタイマーがあります。

def timer
  t = Time.now
  yield
  (Time.now - t).seconds
end

timer do
  # IO
end
=> 1.342

もともと、すべてのジョブを順番に処理していましたが、マシンが 50% の時間 (IO のために) アイドル状態だったことを除けば、これは素晴らしいことでした。

IO 時間を取り戻すために、マルチスレッド モデルに移行しました。ここで、最大 10 の同時スレッドまで、ジョブごとに新しいスレッドを生成します。これはうまく機能しますが、タイマー ブロックの実行中にスレッドがプリエンプトされると、スレッドがスリープしている間もタイマーが「実行」され続け、タイマーが人為的に膨らんだ数値を返すことになります。

私が必要としているのは、スリープに費やした時間を無視して、タイマー ブロックの実際の実行時間を把握する方法です。Thread.current に実行に費やした時間を尋ねるなど、これを達成する方法はありますか?

4

2 に答える 2

1

ここで行っているように、実時間以外のものを測定したい場合は、UNIXメソッドのラッパーであるrusage gem のようなものを使用する必要があります。getrusage

これにより、待機ではなく、実際の実行に費やされた時間の内訳が得られるはずです。

于 2012-06-14T05:54:05.850 に答える
0

Benchmarkは実時間と CPU 時間の両方を測定することでこれを行います。

于 2012-08-03T19:53:05.313 に答える