三元制vs链式If-else-if(性能)

本文关键字:链式 If-else-if 性能 vs 三元 | 更新日期: 2023-09-27 17:49:01

我做了尽职调查,看看之前是否有人问过这个问题,没有发现任何相同但接近的东西,所以,

假设我有一个if-else-if语句链。

foreach (value in valueList)
    if (value == 120) {
        w = true;
    } else if (value == 140) {
        x = true;
    } else if (value == 160) {
        y = true;
    } else if (value == 180) {
        z = true;
    }
}

将else-if链改为三元表达式(如

)有什么好处吗?
foreach (value in valueList) {
    w = (value == 120) ? true : false;
    x = (value == 140) ? true : false;
    y = (value == 160) ? true : false;
    z = (value == 180) ? true : false;
}

我的第一反应是不。由于for循环,每次循环发生时都会进行赋值。而在if-else-if链中,赋值只进行一次。但是比较更频繁(对吧?)有人能帮我解决这个问题吗?

我知道switch在性能方面很容易击败两者。我是否可以基于使用switch不是一种选择的假设来回答这个问题?

我想这个问题中的另一个问题是两者之间的大0比较是什么?

三元制vs链式If-else-if(性能)

请注意,这两种解决方案非常不同。第一个只将true分配给这四个变量中的一个,而另一个将覆盖所有四个变量之前的值。

也就是说,在第二个代码中使用三元操作符是非常糟糕的。你可以直接赋值比较的结果:

w = value == 120;
x = value == 140;
y = value == 160;
z = value == 180;

撇开语义不谈,这也可能使它比if/else结构更有性能。您可能认为只运行一次比较就会更快,所以第一个解决方案应该更好,但实际上,分支可能很慢。由于比较运算实际上是非常快的,仅仅将比较运算的结果赋值四次可能会"更快"。

注意,这些都不会对产生任何性能影响。两者都是非常低级的,而且很有可能在你的应用程序代码中有其他一些慢得多的东西,成为更有可能的瓶颈。所以我不会在这里强调使用一种或另一种方法来实现性能;只要选择语义正确的,然后使用任何使语义尽可能清晰的解决方案。

我知道在性能方面,切换很容易击败两者。

一个switch语句给你的效果和一连串if和else是一样的,所以这里并没有什么区别。

我想这个问题中的另一个问题是两者之间的大0比较是什么?

Both都是线性的,因为你只是循环遍历列表。其他的差别都是常数,所以在大0符号中没有关系。

两个的功能完全不同。业绩无关紧要;他们不做同样的事情。

如果满足条件,第一个代码片段将适当的变量设置为true,如果不满足相应的条件,则不做任何事情,这意味着它保留原始值。

第二个代码段在每次迭代时为每个变量赋值。

因此,第一个代码段实际上是在问,"是否有任何值等于这个数字",对于每个数字,第二个代码段实际上是在问,"最后一个值是否等于这个数字"。我假定您是指前者,而不是后者,因此后者完全是错误的

嗯,在integers的情况下,当我有太多的情况时,我真的喜欢使用switch。@ima在这个答案中解释了这一点。否则,只关心什么看起来更好或更"可读"

然而,使用switchstrings是一个完全不同的故事,在这篇文章中解释。

为了避免不必要的赋值,在三元操作符内使用它们。转义条件使用空if模式。

foreach (var value in valueList)
    if (value == 120 ? w = true : value == 140 ? x = true : value == 160 ? y = true : value == 180 ? z = true : false) ;

三元操作符内的操作数只有在满足相应条件时才计算。