2013-03-25 3 views
9

特定のメソッドの平均実行時間を測定するためにPerformanceCounterを設定しようとしています。私はAverageTimer32を読もうとしましたが、多くの例を見てきましたが、それを正しく理解できないようです。AverageTimer32についての混乱PerformanceCounter

私はその後、私はカウンター

PC = new PerformanceCounter(categoryName, counterName, false); 

BPC = new PerformanceCounter(categoryName, baseCounterName, false); 

PC.RawValue = 0; 
BPC.RawValue = 0; 

を作成し、最終的に私は、経過時間に私の方法は

ようにすること
private void TheMethodIWantToMeasure() { 
    Stopwatch stopwatch = Stopwatch.StartNew(); 

    // Fake work that take ~50ms 
    Thread.Sleep(50 + random.Next(-10, 10)); 

    stopwatch.Stop(); 

    PC.IncrementBy(stopwatch.ElapsedTicks); 
    BPC.Increment(); 
} 

呼び出されるたびにログカテゴリに

CounterCreationDataCollection CCDC = new CounterCreationDataCollection(); 

// Add the counter. 
CounterCreationData averageTimer32 = new CounterCreationData(); 
averageTimer32.CounterType = PerformanceCounterType.AverageTimer32; 
averageTimer32.CounterName = counterName; 
CCDC.Add(averageTimer32); 

// Add the base counter. 
CounterCreationData averageTimer32Base = new CounterCreationData(); 
averageTimer32Base.CounterType = PerformanceCounterType.AverageBase; 
averageTimer32Base.CounterName = baseCounterName; 
CCDC.Add(averageTimer32Base); 

// Create the category. 
PerformanceCounterCategory.Create(categoryName, "Demonstrates usage of the AverageTimer32 performance counter type", PerformanceCounterCategoryType.SingleInstance, CCDC); 

を設定これで、私はこのように見えるパフォーマンスモニタに結果をもたらします。私は50ミリ秒の周りに代わりcontious曲線のスパイクを取得: Picture

私はAverageTimer32を誤解していますか?私はそれについて読んだが、少し混乱している。しかし、私は実際に私と同じことをやっている例を見てきましたので、うまくいくはずです。私はスパイクだけを得る理由は何でしょうか?

編集 それはTheMethodIWantToMeasureのみごと〜5秒と呼ばれていることを言及する価値があるかもしれない、と私はちょうど私がスパイクおき〜第五秒を得ることに気づきました。しかし、AverageTimer32が式((N 1 -N 0)/ F)/(B 1 -B 0)を使用すると、その結果にどのように影響する可能性があるのか​​分かりません。それはNとBの値をどれくらいの頻度で保存するかに依存してはいけませんか?

答えて

1

回答は、パーマン設定のリフレッシュ/サンプルレートにあります。 〜5sの間隔を取ったり、少なくとも〜10msのようなものに変更すると、当初期待していたようにグラフが見えることがあります。または、パフォーマンスカウンタのリフレッシュレートを高い間隔(30秒)に更新することも同じです。 (perfMonグラフ - >プロパティ - >一般タブ - > Sampe毎x秒)を右クリックしてください。

なぜなら、perfMonは(デフォルトで)1秒ごとにリフレッシュしてから、平均を表示する必要があるからです。したがって、カウンタに2番目に追加した操作は "all"で、グラフ上にプロットされます。

例:あなたが第二に実行操作(0.1ms、0.2msの& 0.3、MS)を持っていた場合は、PERFMONは正しいです0.2msの、であるためにあなたの平均を表示します。

ギャップはなぜですか?あなたの平均が計算され、次の秒(perfMonが再びリフレッシュされるとき)の次の秒が表示されるので、それは0秒= 0で0回の操作の平均を計算するからだと思う。

私の提案あなたのTheMethodIWantToMeasureの平均実行時間の平均を実際に見るには、から完全にを5秒間隔で取り出し、メソッドを継続的に実行させてください。

関連する問題