三元制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比较是什么?
请注意,这两种解决方案非常不同。第一个只将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在这个答案中解释了这一点。否则,只关心什么看起来更好或更"可读"
然而,使用switch
与strings
是一个完全不同的故事,在这篇文章中解释。
为了避免不必要的赋值,在三元操作符内使用它们。转义条件使用空if模式。
foreach (var value in valueList)
if (value == 120 ? w = true : value == 140 ? x = true : value == 160 ? y = true : value == 180 ? z = true : false) ;
三元操作符内的操作数只有在满足相应条件时才计算。