5

ループがwhileあり、それが行うのはメソッド呼び出しだけです。ループの外側にタイマーがあり、ループ内でメソッド呼び出しにかかる時間を段階的に追加する別のタイマーがあります。外側の時間は約 17 秒かかり、内側のタイマーの合計は 40 ミリ秒です。ループは 50,000 回実行されています。コードの例を次に示します。

long InnerTime = 0;
long OutterTime = 0;
Stopw1.Start();
int count = 1;
while (count <= TestCollection.Count) {
    Stopw2.Start();
    Medthod1();
    Stopw2.Stop();
    InnerTime = InnerTime + Stopw2.ElapsedMilliseconds;
    Stopw2.Reset();
    count++;
}
Stopw1.Stop();
OutterTime = Stopw1.ElapsedMilliseconds;
Stopw1.Reset();

どんな助けでも大歓迎です。マッシモ

4

6 に答える 6

8

あなたはリンゴとオレンジを比較しています。外側のタイマーは、かかった合計時間を測定します。内部タイマーは、 への呼び出しにかかったミリ秒Method1を測定します。

ElapsedMillisecondsプロパティは、「最も近い整数ミリ秒値に切り捨てられた経過時間を表します」。したがって、約 50,000 回、最も近いミリ秒に切り捨てられます。

への呼び出しにMethod1かかる時間が平均して 1 ミリ秒未満の場合、ほとんどの場合、「ElapsedMilliseconds」プロパティは 0 を返し、内部カウントは実際の時間よりもはるかに少なくなります。実際、あなたのメソッドは平均で約 0.3 ミリ秒かかるため、1 ミリ秒を 40 回超えることさえ幸運です。

Elapsed.TotalMillisecondsの代わりにまたはElapsedTicksプロパティを使用しますElapsedMilliseconds。1 ミリ秒は 10,000 ティックに相当します。

于 2012-07-19T17:45:11.323 に答える
2

これは何をしているのですTestCollection.Countか?

あなたの17秒はあなたの50,000アイテムを何度も数えるのに費やされていると思います。

于 2012-07-19T17:29:58.067 に答える
1

これを変更してみてください:

while (count <= TestCollection.Count) {
...
}

これに:

int total = TestCollection.Count;
while (count <= total) {
...
}
于 2012-07-19T17:33:04.517 に答える
1

他の人がすでに言ったことに加えて、一般に、C# コンパイラは次のようなプロパティを再評価する必要があります。

TestCollection.Count

ループの繰り返しごとに。プロパティの値は、反復ごとに変化する可能性があります。

値をローカル変数に代入すると、コンパイラがループの反復ごとに再評価する必要がなくなります。

私が認識している 1 つの例外は Array.Length です。これは、特に配列の最適化の恩恵を受けます。これはArray Bounds Check Eliminationと呼ばれます。

于 2012-07-19T17:37:55.063 に答える
0

このような小さな方法を個別に測定するべきではありません。しかし、本当にやりたいのであれば、これを試してください:

long innertime = 0;

while (count <= TestCollection.Count) 
{     
    innertime -= Stopw2.GetTimestamp();
    Medthod1();
    innertime += Stopw2.GetTimestamp();
    count++; 
} 

Console.WriteLine("{0} ms", innertime * 1000.0 / Stopw2.Frequency);
于 2012-07-19T17:57:33.487 に答える