0

このコードを while ループ内で 10000 回実行しましたが、timeSpent が最初の 500 回を除いて約 4 であることに気付きました。なぜですか?

Stopwatch s;
long price;
count = 10000;
while (count!=0)
{
   s = Stopwatch.StartNew();

   price = classA.Method(..some inputs...);  //this method do some iterations to return back a long given some inputs

   s.Stop();
   timeSpent = s.ElapsedTicks / (Stopwatch.Frequency / (1000L * 1000L));
   s.Reset();
   /*write the price, timeSpent and inputs into a .txt file*/
   count--;
}
4

1 に答える 1

2

メソッドが最初に呼び出されると、ILからネイティブコードにコンパイルされます。以降の呼び出しでは、生成されたネイティブコードが再利用されます。したがって、一般的に、メソッドを最初に呼び出すときは最も時間がかかると予想されます。

残念ながら、これが原因であることを証明するのは難しいですが、それが原因かもしれません。ベンチマーク/プロファイリング時にこれと同じことが何度も発生するのを見てきました。最初の呼び出しに最も時間がかかります。私は通常、最初の実行を破棄することでこれを回避しました。

もちろん、呼び出しているメソッドには副作用があり、リソースを取得してキャッシュすることも、最初の呼び出しで1回だけ発生することもあります。これらは、私が確信するのが難しいと私が言う理由のほんの一部です。

于 2012-12-28T05:21:50.977 に答える