42

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

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

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

4

5 に答える 5

118

私は1億の三項演算子と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();

結果は次のとおりです(1GBのRAMを搭載したIntel Atom 1.66ghzで実行しましたが、それは最悪です)。

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

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

私がそれらを1億回実行したことを忘れないでください、そして私は2つの問題の間に0.00000000319秒の違いはそれほどないと思います。

于 2012-07-25T05:36:44.597 に答える
23

いいえ。

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

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

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

于 2012-07-25T05:30:44.470 に答える
19

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

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

多くの人がこの演算子を誤用して、1行の長いコードにあまりにも多くのロジックを詰め込んでいると思います。個人的には、行全体が約80文字未満でない限り使用しません。

良い:

return isFunky ? funkyValue : null;

悪い:

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

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

于 2012-07-25T05:34:12.517 に答える
8

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

于 2012-07-25T05:35:56.050 に答える
3

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

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

于 2012-07-25T05:32:59.357 に答える