時間の測定に問題があり、本当に気になります。私は次のコードのようなものを実行しています(C#で):
Stopwatch sw = Stopwatch.StartNew();
Foo(args);
sw.Stop();
//log time
public void Foo(var args)
{
Stopwatch sw = Stopwatch.StartNew();
//do stuff
sw.Stop();
//log time
}
そして、結果は両方の時間の間に大きな違いがあります、私のコードは私に与えます:関数の内側から15535ミリ秒、そして外側から15668ミリ秒... 133msは関数呼び出しのために私にはたくさんのようです(私が10のパラメータを持っていても私に与える)、またはストップウォッチの精度(これは非常に正確であると思われます)を非難するために。
この時代の違いをどのように説明しますか?
注1:同じことがいくつかの連続した呼び出しで発生します:5つの呼び出しで133、81、72、75、75ミリ秒の差があります
注2:私の関数の実際のパラメーターは次のとおりです:
- 6つのクラスオブジェクト
- 構造体の1つの配列(配列は参照として渡されますよね?)
- 2 ref int
- 1バイト[]
- 1アウトクラス
- 小さいサイズ(<25バイト)の1つの構造体
更新:リリースでは、最初の呼び出しの違いはさらに大きくなり(リリースでは、JITコンパイルのコストが高くなります。これは、それを説明できますか?)、次のステップには同じオーバーヘッド(〜75ミリ秒)があります。 1つをパラメーターとして渡し、関数の外部にログを記録しますが、違いはまだあります。
また、最初に構築する必要のあるパラメーターとしていくつかのプロパティを指定していることを忘れたため、最初の呼び出しの50ミリ秒の違いは、プロパティの初期化とJITコンパイルによって説明される可能性があります。