3

時間の測定に問題があり、本当に気になります。私は次のコードのようなものを実行しています(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コンパイルによって説明される可能性があります。

4

1 に答える 1

0

私の悪いことに、それはいくつかのディスク読み取りアクセスを行うプロパティを呼び出すプロパティでした。シンプルなメンバーだと思い、深くは行きませんでした。関数呼び出しから呼び出しを取り除いたところ、時間はほぼ同じになりました(0-1ミリ秒、ロギングだと思います)

道徳は次のとおりです。プロパティには副作用があってはなりません。明らかなことをしていないプロパティを作成する場合は、代わりに関数をコーディングするか、少なくともプロパティのドキュメントで何をしているかについて次の開発者に警告してください。

そして、モラルのモラルは次のとおりです。何かが疑わしいと思われる場合は、常にコールツリーを最も深いレベルで見てください。

于 2011-11-16T14:15:26.877 に答える