三元?运算符与 C# 中的传统 If-else 运算符 [重复]

Posted

技术标签:

【中文标题】三元?运算符与 C# 中的传统 If-else 运算符 [重复]【英文标题】:Ternary ? operator vs the conventional If-else operator in c# [duplicate] 【发布时间】:2012-07-23 11:53:27 【问题描述】:

可能重复:Is the conditional operator slow?

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

在使用? 操作符时会有这样的性能开销吗?

【问题讨论】:

你可以在这里得到很好的答案...在这个***.com/questions/3312786/… 请考虑阅读此主题:***.com/questions/2259741/…。恕我直言,您的经理模棱两可 希望此链接对您有所帮助。 embeddedgurus.com/stack-overflow/2009/02/… 在 C# 中关心这两个概念的性能差异,代码和机器之间存在好几层,这对我来说似乎很愚蠢。 if/else、三元或逻辑短路都不是专门设计的,目的是为了超越其他。它们旨在促进代码清晰。为此使用它们。如果存在性能存在问题的情况(在分析之后),那么在担心编译器如何解释各种分支机制之间的微观差异之前,请开始研究更好的算法。 【参考方案1】:

我运行了 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 秒差异并不重要。

【讨论】:

+1 表示这些统计数据。 我喜欢你真的这样做了! 看到这个答案我忍不住笑了!【参考方案2】:

没有。

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

很可能两者都将编译为相同的 IL。

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

【讨论】:

【参考方案3】:

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

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

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

好:

return isFunky ? funkyValue : null;

不好:

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

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

【讨论】:

如果你把它写在 3 个不同的行上,“坏”的例子就不会那么糟糕了。一个为条件,第二行以“?”开头和以“:”开头并以“;”结尾的纬度线【参考方案4】:

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

【讨论】:

【参考方案5】:

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

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

【讨论】:

以上是关于三元?运算符与 C# 中的传统 If-else 运算符 [重复]的主要内容,如果未能解决你的问题,请参考以下文章

java 使用三元运算符和if-else获取两个和三个数中的最大值

三元运算符的速度是 if-else 块的两倍?

为啥使用“if-else”语句会在看似相同的三元运算符构造不会产生 TypeScript 编译器错误?

三元运算符如何比较 JavaScript 中的字符和数字?

C#中的三元运算符

三元(三目)运算符