33

私は自分のコードを最適化して、コードをもう少し簡潔で読みやすいものにしようとしてきましたが、それによってパフォーマンスが低下しないことを願っていました。変更によってアプリケーションの速度が低下した可能性があると思いますが、それは私の頭の中にあるだけかもしれません。次の間にパフォーマンスの違いはありますか:

Command.Parameters["@EMAIL"].Value = email ?? String.Empty;

Command.Parameters["@EMAIL"].Value = (email == null) ? String.Empty: email;

if (email == null)
{
    Command.Parameters["@EMAIL"].Value = String.Empty
}
else
{
    Command.Parameters["@EMAIL"].Value = email
}

読みやすさの好みは、null 合体演算子です。パフォーマンスに影響を与えたくありませんでした。

4

7 に答える 7

72

ここでマイクロ最適化を試みていますが、それは一般的に大きな問題です。これが問題であることを示すパフォーマンス分析がない限り、変更する価値さえありません。

一般的な使用では、正しい答えは維持しやすいものです。

とはいえ、null 合体演算子の IL は次のとおりです。

L_0001: ldsfld string ConsoleApplication2.Program::myString
L_0006: dup 
L_0007: brtrue.s L_000f
L_0009: pop 
L_000a: ldsfld string [mscorlib]System.String::Empty
L_000f: stloc.0 

スイッチの IL は次のとおりです。

L_0001: ldsfld string ConsoleApplication2.Program::myString
L_0006: brfalse.s L_000f
L_0008: ldsfld string ConsoleApplication2.Program::myString
L_000d: br.s L_0014
L_000f: ldsfld string [mscorlib]System.String::Empty
L_0014: stloc.0 

null 合体演算子の場合、値が の場合はnull6 つのステートメントが実行されますが、 の場合はswitch4 つの操作が実行されます。

値が not のnull場合、null 合体演算子は 5 つの操作に対して 4 つの操作を実行します。

もちろん、これはすべての IL 操作にかかる時間が同じであることを前提としていますが、そうではありません。

とにかく、このミクロ スケールで最適化を行うと、すぐに利益が減少し始めることがわかると思います。

そうは言っても、ほとんどの場合、この場合、読みやすく維持しやすいものが正しい答えです。

非効率的であることが証明されている規模でこれを行っていることがわかった場合 (これらのケースはほとんどありません)、測定してどちらのパフォーマンスが優れているかを確認し、その特定の最適化を行う必要があります。

于 2009-02-13T19:27:27.290 に答える
69

私見、読みやすさと理解のために最適化してください - 実行時のパフォーマンスの向上は、数か月後にこのコードに戻って、一体何だったのかを理解しようとすると、現実の世界でかかる時間と比較して最小限になる可能性がありますそもそもやっている。

于 2009-02-13T19:12:34.970 に答える
18

変更によってアプリケーションの速度が低下した可能性があると思いますが、それは私の頭の中にあるだけかもしれません。

実際にパフォーマンスを測定しているのでない限り、それはすべて頭の中にあり、怠惰な憶測です。

(特にあなたを選ぶわけではありませんが、「測定」という言葉が含まれていないパフォーマンスのマイクロ最適化(および多くの回答)についての質問を次々と見るのは非常に残念です。)

于 2009-02-13T19:50:21.527 に答える
7

この場合、パフォーマンスに大きな違いはほとんどありません。

パフォーマンスの違いが無視できる場合、それはすべて読み取り可能なコードに関するものです。

于 2009-02-13T19:17:45.473 に答える
7

性能差はないと思います。

それに加えて、この場合、一方のステートメントを他方よりも優先することに懸念を抱くのはなぜでしょうか? つまり、パフォーマンスへの影響 (ある場合) は最小限に抑えられます。私見、これは一種のマイクロ最適化であり、努力する価値はありません。
私は、最も読みやすく、最も明確で、影響が最小限であるため (この場合) パフォーマンスについて心配しないステートメントを選択します。

于 2009-02-13T19:13:47.073 に答える
2

議論のために... if/then/else は ?: 三項演算と同じくらい速く実行され、単一レベルの switch/case ステートメントと同じくらい速く実行されます。

C# コードを使用したパフォーマンス ベンチマークを次に示します。

パフォーマンスが深刻な影響を受け始めるのは、case ステートメントで 2 ~ 3 レベルの深さを取得し始めたときだけです。つまり、次のばかげた例のようなものです。

switch (x % 3)
    {
        case 0:
            switch (y % 3)
            {
                case 0: total += 3;
                    break;
                case 1: total += 2;
                    break;
                case 2: total += 1;
                    break;
                default: total += 0;
                    break;
            }
            break;
        case 1:
            switch (y % 3)
            {
                case 0: total += 3;
                    break;
                case 1: total += 2;
                    break;
                case 2: total += 1;
                    break;
                default: total += 0;
                    break;
            }
            break;
    case 2:
            switch (y % 3)
            {
                case 0: total += 3;
                    break;
                case 1: total += 2;
                    break;
                case 2: total += 1;
                    break;
                default: total += 0;
                    break;
            }
            break;
    default:
        switch (y % 3)
        {
            case 0: total += 3;
                break;
            case 1: total += 2;
                break;
            case 2: total += 1;
                break;
            default: total += 0;
                break;
        }
        break;
    }
于 2014-09-14T13:53:23.027 に答える