2012-03-14 6 views
5

なります。しかし、テストが終了すると、パフォーマンスカウンタの平均値はゼロになります。それはなぜ?AverageTimer32カウンタ値は、私は以下のようなコードの一部を書かれているゼロ

おそらく、間違ったカウンタを使用していますか?

私が必要とするのは、私には機能があり、平均的にはその機能が完了するまでの時間を計算しなければならないということです。以下のような何か:

void ComputeAndLog() 
{ 
    Stopwatch stopWatch = Stopwatch.StartNew(); 
    FunctionWhoseAveragetTimeIsToBeMeasured(); 
    write_counter(stopWatch.ElapsedTicks); 
} 

void write_counter(long timeForCompletion) 
{ 
    averageTimeCounter.IncrementBy(timeForCompletion); 
    averageBaseCounter.Increment(); 
} 

おかげ XOXO

+1

ソクラテス:増分がない平均は何ですか? –

+0

申し訳ありませんが、私はその質問を得ていませんでした。おそらく私は間違ったカウンターを使用していますか?私は要件を持つ初期コードを更新しました。 –

+0

最後の測定以降の平均期間です。あなたが何も記録していなければ、平均期間が定義されていない(ゼロに単純化されている)のでゼロになります。 – Guvante

答えて

4

AverageTimer32/64はあなたが行うすべての測定値の平均値を計算しません。代わりに、測定した操作数に測定値を比例させます。

基本的に、コードの問題は、測定を行うたびに新しいタイマーを使用していることです。

AverageTimerの仕組みを理解するには、その背後にある数式を理解すると役に立ちます。これは、AverageTimerを使用するためにAverageBaseが必要な理由も答えています。

AverageTimerための式は以下の通りである:

((N1 - N0)/F)/(B1 - B0) 

を時間t(AverageTimer)tにおいて、前に読み出し

  • N0で

    • N1の電流読み取りで - 1(AverageTimer)
    • 現在のカウンタはt(AverageBase)
    • で、前には、t-1(Average Base formularティックの現在時刻を取得し、前のものを減算要するにティック/秒

    を計算する)

  • F因子。結果をファクタFで割った値は、t-1で最後に測定してからの操作実行時間を示します。

    これを現在のカウンタからカウンタを差し引いた値で除算します。これは通常1つかもしれません。その結果、1回の測定で平均操作時間が得られます。

    AverageBaseを使用すると、さまざまな測定ポイントをステップオーバーできます。あなたが実行する10番目の操作ごとにカウンタを設定できるケースを考えてみましょう。最後の測定以降、10回すべての操作でAverageTimerを新しい時間測定値で増分しますが、AverageBaseを10ずつ増やします。最終的に、1回の操作の平均時間が表示されます(10回の操作呼び出しのすべてを測定した場合でも)。

    コード例を見ると、タイマーの開始からタイマーの終了までの間に常に差があります。 AverageBaseを1ずつ増加させながら、これを10,9,8,7,6のような一連の数字とします。Fは、簡単のため1であると/ F /(10)= -1/F/1

    -

    (10 9):あなたが知っている第二の測定のため

    は、以下の結果を受信します結果として-1が得られます。/F /(1 - 提出する

    正しい値は、しかし、我々は

    (10 19)を得るであろう再び同じ例

    10、19、27、34、40

    なければなりません - 0)= 9/F/1

    また、Fが1の場合、操作の平均時間は9になります。 ご覧のとおり、AverageTimerが正しく機能するように、測定された次の値が前の値よりも大きくなる必要があります。

    例では、グローバルストップウォッチを使用することができます。新しいものを起動する代わりに、Restart()ではなくStart()を使用してください。上記のように、カウンタは内部的に時間差を計算します。そうすれば正しい測定値が得られます。

    ゼロになることも意味があります。テストやプログラムが終了したら、カウンタはおそらく閉じられ、もう値は提供されません。カウンターでClose()メソッドを呼び出すことで手動で行うことができます。

  • +0

    私はこの答えが正しいとは思わない。質問では、Nは常に経過したダニで増分*されます。したがって、N1がN0より小さくなることはできません(最初の例のように)。そして、残りの結論は(おそらく)間違っています。 –

    0

    同様の問題がありました。私はAverangeCounterによってPerformanceMonitorで良い結果を出しました。しかし、プログラムの操作では、NextValueは常に0を返します。ところで、ElapsedTimeカウンタでは、同じ操作の戻り値が必要です。

    次に、私はAverageTimer32のコアを理解しています(私は願っています)。 AverageTimer32に平均作業時間が表示されることは避けてください。 1つの操作の平均時間をタイマーにして表示します。何の作業もない場合、稼働時間がなく、カウンターの値として0があります。

    私がNextValueを取るたびに、それをカウンターに追加して秒数を返します(平均値ではなく最後の値を返します)。AverageTimer32カウンターには誰でも誤解する可能性のある名前があります。私はそれをキャッシュすると、私はそれをより読みやすい形式に変換し、プログラムのカウンタの値として使用することができます(2回目に0を受け取った直後にNextValueを要求すると)。

    また、以前の回答を修正したいと思います。あなたは

    10、9、8、7、6

    代わりの

    10、19、27、34、40

    使用使用する必要がありますメソッドIncreaseByおよび

    10、 19,27,34,40

    RawValueでStopwatch.GetTimestamp()を手動で設定した場合。

    関連する問題