6

メソッド Foo() があり、どのタイプの Windows パフォーマンス カウンターを使用すればよいかを実行するのにかかった時間をミリ秒単位で測定したいとします。

var stopwatch = new Stopwatch();
stopwatch.Start();
Foo();
stopwatch.Stop();
counter.RawValue = stopwatch.TotalMilliseonds;

現在 NumberOfItems64 を使用していますが、新しい操作が実行されない限り、カウンターの最後の値が保持されます。それは望ましいですか?または、操作が完了するとすぐにカウンターをゼロにする必要がありますか? この状況でどのカウンタータイプを選択しますか?またその理由は?

4

4 に答える 4

7

これはAverageTimer32の良い候補のように思えます。詳細については、この SO の回答を参照してください。

于 2009-12-10T08:16:46.487 に答える
1

前の回答に追加すると、CodeProject の既製およびカスタムメイドの両方のパフォーマンス カウンターに関する非常に優れた記事があります。

于 2009-12-10T08:12:50.527 に答える
0

通常はストップウォッチを使用しますが、kernel32.dll に対しても p/invoke を使用しています。

  [DllImport("Kernel32.dll")]
  private static extern bool QueryPerformanceCounter(out long lpPerformanceCount);

  [DllImport("Kernel32.dll")]
  private static extern bool QueryPerformanceFrequency(out long lpFrequency);

Start() と Stop() という 2 つのメソッドがあります。

  public void Start()
  {
     Thread.Sleep(0);
     QueryPerformanceCounter(out startTime);
  }


  public void Stop()
  {
     QueryPerformanceCounter(out stopTime);
  }

Start() と Stop() の呼び出し間の期間を照会するには:

  public double Duration
  {
     get
     {
        return (double)(stopTime - startTime)*1000 / (double)freq;
     }
  }

freqコンストラクターで決定されることに注意してください。

  public PerformanceTimer()
  {
     startTime = 0;
     stopTime = 0;

     if (QueryPerformanceFrequency(out freq) == false)
     {
        // not supported
        throw new Win32Exception();
     }
  }

私のニーズでは、あまり違いに気づきませんでしたが、両方を試して、自分に合ったものを確認することをお勧めします.

編集: MSDN から元のコードを見つけることができました。.Net 1.1 以降、いくつかの改善が行われたようです。持ち帰りのメッセージは、この方法がナノ秒の精度を提供すると Microsoft が主張しているということです。

于 2009-12-10T08:07:51.693 に答える
0

答えと質問:

回答: ローテクは私にとってはうまくいきます。マイクロ秒が欲しいですか?10^6 回ループして、時計を使用します。

質問: コードを高速化するために質問していますか? 次に、これを検討してください。

于 2009-12-10T13:03:06.900 に答える