3

コードでは ValidateRequest メソッドが定義されています

    private bool ValidateRequest()
    {
        return _doc != null;
    }

このメソッドは、_doc が null かどうかを確認したいすべての場所から呼び出されます。このメソッドは、cs ファイルで 5 回使用されています。

パフォーマンスの観点から、行だけでメソッドを定義することをお勧めしますか? このメソッドを呼び出す前に、呼び出されたものはすべてスタックにプッシュされ、その後スタックからプルされると思います。

何かご意見は?

=== 編集 ====

.NET バージョン 3.5 を使用しています

4

4 に答える 4

7

気にしないでください。対応するILが非常に短いため、コンパイラはおそらくメソッドをインライン化します。

そのメソッドがコードの保守性に役立つ場合は、意図を伝えるため、コードの保守性を維持します。

于 2012-04-24T13:54:24.560 に答える
7

It's highly unlikely that moving a single line into a method will have a significant impact on your application. It's actually quite possible that this will have no impact as the JIT could choose to inline such a function call. I would definitely opt for keeping the check in a separate method unless a profiler specifically showed it to be a problem.

Focus on writing code that is clear and well abstracted. Let the profiler guide you to the real performance problems.

于 2012-04-24T13:58:29.667 に答える
5

いつものように:疑問がある場合は、ベンチマークを実行してください。
また、ベンチマークを実行するときは、リリースモードで実行してください。そうしないと、コンパイラの最適化でベンチマークを実行できません。

その後、それが実際にパフォーマンスに影響を与える場合は、NGenでインライン化できます。
このSO投稿はそれについて話します。

于 2012-04-24T13:54:21.487 に答える
1

わかりました。これはLinqPadからのものであり、決定的な答えではないと思いますが、次のコードはごくわずかな不一致を生み出しました:(00:00:00.7360736 vs 00:00:00.0740074)

void Main()
{
    var starttime = DateTime.Now;
    for (var i = 0; i < 1000000000; i++)
    {
        if (ValidateRequest()) continue;
    }
    var endtime = DateTime.Now;
    Console.WriteLine(endtime.Subtract(starttime));

    starttime = DateTime.Now;
    for (var i = 0; i < 100000000; i++)
    {
        if (_doc != null) continue;
    }
    endtime = DateTime.Now;
    Console.WriteLine(endtime.Subtract(starttime));
}

private object _doc = null;

private bool ValidateRequest()
    {
        return _doc != null;
    }
于 2012-04-24T14:05:40.013 に答える