24

次のプログラムを実行してパフォーマンスカウンターを見ると、結果がわかりません。平均値はゼロであり、最小/最大値は、私が〜0.1または〜100を期待する場合、〜0.4です。

私の問題は何ですか?

コード

class Program
{
    const string CategoryName = "____Test Category";
    const string CounterName = "Average Operation Time";
    const string BaseCounterName = "Average Operation Time Base";

    static void Main(string[] args)
    {
        if (PerformanceCounterCategory.Exists(CategoryName))
            PerformanceCounterCategory.Delete(CategoryName);

        var counterDataCollection = new CounterCreationDataCollection();

        var avgOpTimeCounter = new CounterCreationData()
        {
            CounterName = CounterName,
            CounterHelp = "Average Operation Time Help",
            CounterType = PerformanceCounterType.AverageTimer32
        };
        counterDataCollection.Add(avgOpTimeCounter);

        var avgOpTimeBaseCounter = new CounterCreationData()
        {
            CounterName = BaseCounterName,
            CounterHelp = "Average Operation Time Base Help",
            CounterType = PerformanceCounterType.AverageBase
        };
        counterDataCollection.Add(avgOpTimeBaseCounter);

        PerformanceCounterCategory.Create(CategoryName, "Test Perf Counters", PerformanceCounterCategoryType.SingleInstance, counterDataCollection);

        var counter = new PerformanceCounter(CategoryName, CounterName, false);
        var baseCounter = new PerformanceCounter(CategoryName, BaseCounterName, false);

        for (int i = 0; i < 500; i++)
        {
            var sw = Stopwatch.StartNew();
            Thread.Sleep(100);
            sw.Stop();

            Console.WriteLine(string.Format("t({0}) ms({1})", sw.Elapsed.Ticks, sw.Elapsed.TotalMilliseconds));
            counter.IncrementBy(sw.Elapsed.Ticks);
            baseCounter.Increment();
        }

        Console.Read();
    }
}

パフォーマンスカウンターのスクリーンショット パフォーマンスカウンターのスクリーンショットhttp://friendfeed-media.com/50028bb6a0016931a3af5122774b56f93741bb5c

4

3 に答える 3

34

System.Diagnostics APIには、非常に微妙な混乱の原因が含まれています。System.Diagnosticsの「ティック」はDateTimeまたはTimeSpanの「ティック」と同じではありません。

StopWatch.Elapsed.Ticksの代わりにStopWatch.ElapsedTicksを使用すると、機能するはずです。

ドキュメントには、これに関する詳細情報が含まれています。

于 2009-10-10T06:37:42.010 に答える
9

Mark Seemann が問題の紛らわしい原因を説明しましたが、少し追加情報を提供したいと思います。

aではなく aAverageTimer32からパフォーマンス カウンターを設定する場合は、次の変換を実行できます。TimeSpanStopwatch

var performanceCounterTicks = timeSpan.Ticks*Stopwatch.Frequency/TimeSpan.TicksPerSecond;
averageTimerCounter.IncrementBy(performanceCounterTicks);
averageTimerCounterBase.Increment();
于 2012-02-10T15:00:04.503 に答える