10

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

カテゴリーを設定しました

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);

次に、カウンターを作成します

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();
}

このようにすると、パフォーマンス モニターは次のようになります。50 ミリ秒付近で連続的な曲線ではなくスパイクが発生します。 写真

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

編集のみが 5 秒ごとに呼び出される ことに言及する価値があるかもしれませんがTheMethodIWantToMeasure、5 秒ごとにスパイクが発生することに気付きました。AverageTimer32しかし、式 ((N 1 -N 0)/F)/(B 1 -B 0) を使用すると、結果にどのように影響するかわかりません。N と B の値を保存する頻度に依存するべきではありませんか?

4

1 に答える 1

2

あなたの答えは、パーモン設定のリフレッシュ/サンプルレートにあります。~5sの間隔を削除するか、少なくとも~10msのように変更すると、グラフが当初の予想に少し似ていることに気付くでしょう。または、パフォーマンス カウンターのリフレッシュ レートをより高い間隔 (30 秒) に更新しても同じです。( perfMon グラフを右クリックしてこれを行います -> プロパティ -> 一般タブ -> Sampe Every x seconds )。

その理由は、perfMon が 1 秒ごとに更新され (デフォルトで)、平均を表示する必要があるためです。そのため、その秒のカウンターに追加した「すべて」の操作を取得し、グラフにプロットします。

例: 1 秒間に3 つの操作を実行した場合( 0.1ms、0.2ms & 0.3,ms )、perfMon は平均を0.2msと表示しますが、これは正しい値です。

なぜギャップ?これは、平均が計算されて「スパイク」が表示された後、次の 1 秒 (perfMon が再び更新されるとき) に、0 秒 = 0 で 0 操作の平均が計算されるためだと思います。

TheMethodIWantToMeasure私の提案 (平均して実行にかかる時間の平均を本当に確認したい場合は、〜 5 秒の間隔を完全に取り除き、単にメソッドを継続的に実行させることです。それでうまくいくはずです。

于 2015-02-02T13:33:35.317 に答える