C# 三元vs链式If-else If(性能)
我做了尽职调查,看看是否有人问过这个问题,但没有发现任何相同的东西,但接近,所以这里开始 假设我有一系列if-else-if语句C# 三元vs链式If-else If(性能),c#,performance,if-statement,big-o,ternary,C#,Performance,If Statement,Big O,Ternary,我做了尽职调查,看看是否有人问过这个问题,但没有发现任何相同的东西,但接近,所以这里开始 假设我有一系列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 (v
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链中,赋值只进行一次。但是比较更频繁(对吗?)。谁能帮我解决这个问题
我知道开关
在性能上很容易击败这两者。我是否可以假设使用开关不是一个选项
我猜这个问题中的另一个问题是,这两者之间的Big-O比较是什么?这两种功能完全不同。表现是无关紧要的;他们不会做同样的事情
如果满足条件,第一个代码段将相应的变量设置为true
,如果不满足相应的条件,则不执行任何操作,这意味着它保留原始值
第二个代码段在每次迭代中为每个变量分配一个值
因此,第一个片段实际上是在问,每个数字的“任何值是否等于这个数字”,第二个片段实际上是在问,每个数字的“最后一个值是否等于这个数字”。我想你想要的是前者,而不是后者,因此后者完全是错误的。两者的作用完全不同。表现是无关紧要的;他们不会做同样的事情
如果满足条件,第一个代码段将相应的变量设置为true
,如果不满足相应的条件,则不执行任何操作,这意味着它保留原始值
第二个代码段在每次迭代中为每个变量分配一个值
因此,第一个片段实际上是在问,每个数字的“任何值是否等于这个数字”,第二个片段实际上是在问,每个数字的“最后一个值是否等于这个数字”。我想你想要的是前者,而不是后者,因此后者完全是错误的。两者的作用完全不同。表现是无关紧要的;他们不会做同样的事情
如果满足条件,第一个代码段将相应的变量设置为true
,如果不满足相应的条件,则不执行任何操作,这意味着它保留原始值
第二个代码段在每次迭代中为每个变量分配一个值
因此,第一个片段实际上是在问,每个数字的“任何值是否等于这个数字”,第二个片段实际上是在问,每个数字的“最后一个值是否等于这个数字”。我想你想要的是前者,而不是后者,因此后者完全是错误的。两者的作用完全不同。表现是无关紧要的;他们不会做同样的事情
如果满足条件,第一个代码段将相应的变量设置为true
,如果不满足相应的条件,则不执行任何操作,这意味着它保留原始值
第二个代码段在每次迭代中为每个变量分配一个值
因此,第一个片段实际上是在问,每个数字的“任何值是否等于这个数字”,第二个片段实际上是在问,每个数字的“最后一个值是否等于这个数字”。我想你想要的是前者,而不是后者,所以后者完全是错误的。好吧,在整数的情况下,当我有太多的情况时,我真的喜欢使用开关@伊玛解释道。否则,什么看起来更好或更“可读”才重要
然而,使用带有字符串的开关
是一个完全不同的故事,如本文所述 好吧,对于整数
,当我有太多的情况时,我真的很喜欢使用开关
@伊玛解释道。否则,什么看起来更好或更“可读”才重要
然而,使用带有字符串的开关
是一个完全不同的故事,如本文所述 好吧,对于整数
,当我有太多的情况时,我真的很喜欢使用开关
@伊玛解释道。否则,什么看起来更好或更“可读”才重要
然而,使用带有字符串的开关
是一个完全不同的故事,如本文所述 好吧,对于整数
,当我有太多的情况时,我真的很喜欢使用开关
@伊玛解释道。否则,什么看起来更好或更“可读”才重要
然而,使用带有字符串的开关
是一个完全不同的故事,如本文所述 请注意,这两种解决方案非常不同。第一个变量只将true
赋值给这四个变量中的一个,而另一个变量将覆盖这四个变量之前的任何值
也就是说,在第二个代码中使用三元运算符是非常糟糕的。您可以直接指定比较结果:
w = value == 120;
x = value == 140;
y = value == 160;
z = value == 180;
撇开语义不谈,这也可能使它比if/else结构更具性能。您可能认为只运行一个比较会使它更快,因此第一个解决方案应该更好,但事实上,分支。而且,由于比较操作实际上非常快,只需将比较结果分配四次就可能“更快”
请注意,所有这些实际上都不会对性能产生任何实际影响。两者都是非常低级的,并且很可能在应用程序的代码中有其他更慢的东西,成为一个更可能的瓶颈。所以我不会在这里强调使用一种或另一种方式来实现性能;