三元?运算符与c#中的常规If-else运算符

时间:2012-07-25 05:12:58

标签: c# if-statement ternary-operator

  

可能重复:
  Is the conditional operator slow?

我是C#中?运算符的大量用户。但是,我的项目经理经常警告我,与大型应用程序中的?语句相比,使用If-Else运算符可能会花费一些性能。所以我被告知要避免使用它。但是,我喜欢使用它,因为它简洁而且保持代码清洁。

使用?运算符时是否存在此类性能开销?

5 个答案:

答案 0 :(得分:99)

我运行了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();

这是结果(在I​​ntel Atom 1.66ghz上运行,1gb内存,我知道,它很糟糕):

  • 三元运算符:每个运算符5986毫秒或0.00000005986秒。

  • If-Else:每个语句5667毫秒或0.00000005667秒。

不要忘记我跑了1亿,我不认为0.00000000319秒之间的差异那么多。

答案 1 :(得分:21)

没有

使用使您的代码可读的内容。如果if语句执行此操作,请使用它们。如果三元运算符这样做,请使用它们。

无论如何,两者都可能会编译成相同的IL。

在任何情况下,使您的应用程序变慢的事情可能是数据库或网络或硬盘驱动器......除了您使用if语句还是三元表达式之外的任何事情。

答案 2 :(得分:14)

没有理由期待性能有任何差异。

在我看来,只有在所有三个操作数都非常简洁易读的情况下才能使用三元运算符。否则我认为它有可能使代码更难阅读。

我认为很多人通过将过多的逻辑干扰到一长串代码中而错误地使用了这个算子。除非整行不超过80个字符,否则我个人不会使用它。

好:

return isFunky ? funkyValue : null;

为:

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

我看到人们做的比上面的情况差很多。我认为他们应该放弃他们的三元特权!

答案 3 :(得分:6)

阅读三元操作非常困难。如果使用嵌套条件,理解三元将成为开销。如果有更多的条件,尽量避免三元。

答案 4 :(得分:3)

从我个人的角度来看,我认为三元运算符和if语句之间没有任何性能差异。许多编程语言都支持它,并且tenary运算符更适合开发人员,而传统的If-else运算符在一般情况下是可以理解的。

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