2

アプリケーション内にインストルメンテーションを実装していますが、PerformanceCounterからWindowsパフォーマンスモニターに表示される値が、記録される値と一致しないという問題が発生しました。

ストップウォッチを使用してメソッドの実行時間を記録し、最初に合計ミリ秒をdoubleとして記録し、次にストップウォッチのTimeSpan.TicksをPerformanceCounterに渡してパフォーマンスモニターに記録します。

perfmonでのパフォーマンスカウンターの作成:

var datas = new CounterCreationDataCollection();
datas.Add(new CounterCreationData 
{
    CounterName = name, 
    CounterType = PerformanceCounterType.AverageTimer32
});

datas.Add(new CounterCreationData 
{
    CounterName = namebase, 
    CounterType = PerformanceCounterType.AverageBase
});

PerformanceCounterCategory.Create("Category", "performance data",
    PerformanceCounterCategoryType.SingleInstance, datas);

次に、記録するために、コレクションから事前に初期化されたカウンターを取得してインクリメントします。

_counters[counter].IncrementBy(timing);
_counters[counterbase].Increment();

...ここで、「タイミング」はストップウォッチのTimeSpan.Ticks値です。

これを実行すると、ストップウォッチのTimeSpanのミリ秒値であるdoubleのコレクションに、1つの値のセットが表示されますが、PerfMonに表示されるのは別の値のセットです。

たとえば...ミリ秒のリストに記録される2つの値は次のとおりです。

23322.675、14230.614

そして、PerfMonグラフに表示されるものは次のとおりです。

15.546、9.930

誰かがこれを説明できますか?

4

1 に答える 1

2

いくつかの推測。

を使用してPerformanceCounterType.AverageTimer32います。それは平均的な時間です。また、各メソッド呼び出しでをリセットしていない可能性もあるStopwatchため、リストに格納している値は、そのメソッドへのすべての呼び出しのこれまでの合計実行時間です。

リストにはミリ秒と言いましたが、パフォーマンスカウンターには目盛りが付いています。ティックは100ナノ秒で、0.0001ミリ秒です。perfmonが14230.614を取得し、リストが15.546を取得するなど、サイズを逆にすることを期待していましたが、それでも桁違いにずれています。

あまり答えはありませんが、コメントには収まりませんでした。

于 2010-03-18T09:34:36.427 に答える