web-dev-qa-db-ja.com

三元?演算子とc#の従来のIf-else演算子

可能性のある複製:
条件演算子は遅いですか?

私はC#の?演算子の大規模なユーザーです。ただし、プロジェクトマネージャーは、?演算子を使用すると、大規模なアプリケーションでのIf-Elseステートメントに比べてパフォーマンスが多少低下する可能性があることを頻繁に警告しています。だから私はそれを使わないように言われました。ただし、簡潔で、コードをクリーンに保つため、私はそれを使用するのが好きです。

?演算子を使用すると、そのようなパフォーマンスのオーバーヘッドはありますか?

39
Paras

1億のTernary Operatorと1億のIf-Elseステートメントを実行し、それぞれのパフォーマンスを記録しました。これがコードです:

Stopwatch s = new Stopwatch();
// System.Diagnostics Stopwatch
int test = 0;
s.Start();
for(int a = 0; a < 100000000; a++)
    test = a % 50 == 0 ? 1 : 2;
s.Stop();

s.Restart();
for(int b = 0; b < 100000000; b++)
{
    if(b % 50 == 0)
        test = 1;
    else
        test = 2; 
}
s.Stop();

これが結果です(Intel Atom 1.66ghzで1GBのRAMで実行しましたが、私はそれが悪いです):

  • 三項演算子:5986ミリ秒または各演算子あたり0.00000005986秒。

  • If-Else:各ステートメントごとに5667ミリ秒または0.00000005667秒。

1億回実行したことを忘れないでください。2つの問題の0.00000000319秒の違いはそれほど大きくないと思います。

109
matthewr

番号。

コードを読みやすくするものを使用します。 ifステートメントがそれを行う場合は、それらを使用します。三項演算子がそれを行う場合は、それらを使用します。

いずれにしても、両方が同じILにコンパイルされる可能性があります。

いずれにしても、アプリケーションの速度を低下させるのは、おそらくデータベース、ネットワーク、ハードドライブなどです。ただし、ifステートメントまたは3項式を使用した場合を除きます。

22
Anthony Mills

パフォーマンスの違いを期待する理由はありません。

私の意見では、3項演算子は、3つのオペランドすべてが非常に簡潔で読みやすい場合にのみ使用する必要があります。そうでなければ、コードを読みにくくする可能性があると思います。

多くの人がこの演算子を長いコードの1行に詰め込みすぎて、この演算子を誤用していると思います。個人的には行全体が約80文字未満でなければ使用しません。

良い:

return isFunky ? funkyValue : null;

悪い:

return (thisThing == thatThing && (anotherThing != null || ! IsThisTrue())) ? someThing.GetThis().GetThat() : yetAnotherThing.GetBlah().GetFoo();

私は人々が上記よりもずっと悪いことをするのを見てきました。彼らは三者の特権を失うべきだと思います!

17
jahroy

3項演算を読み取るのは非常に困難です。ネストされた条件を使用する場合、3項を理解することはオーバーヘッドになります。条件の数が多い場合は、3項を避けてください。

8
user1920811

私の個人的な観点からは、3項演算子とifステートメントの間にパフォーマンスの違いは見られません。多くのプログラミング言語はそれをサポートしており、従来のIf-else演算子が一般的な方法で理解できるように、10項演算子は開発者に優しいです。

http://en.wikipedia.org/wiki/%3F%3a

3
mesimplybj