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();

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

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

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

别忘了我跑了 1 亿次,我认为两者之间的 0.00000000319 秒差异并不重要。

于 2012-07-25T05:36:44.597 回答
23

不。

使用使您的代码可读的东西。如果if语句这样做,请使用它们。如果三元运算符这样做,请使用它们。

无论如何,两者很可能都将编译为相同的 IL。

无论如何,会使您的应用程序变慢的事情可能是数据库或网络或硬盘驱动器......除了您是否使用if语句或三元表达式之外的任何东西。

于 2012-07-25T05:30:44.470 回答
19

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

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

我认为很多人误用了这个运算符,把太多的逻辑塞进一长行代码中。除非整行少于 80 个字符,否则我个人不会使用它。

好的:

return isFunky ? funkyValue : null;

坏的:

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

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

于 2012-07-25T05:34:12.517 回答
8

三元运算很难读懂。如果使用嵌套条件,理解三元将成为一种开销。如果条件数量更多,请尽量避免使用三元。

于 2012-07-25T05:35:56.050 回答
3

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

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

于 2012-07-25T05:32:59.357 回答