三元 vs 链式 If-else-if(性能)
Ternary vs Chained If-else-if (Performance)
我做了尽职调查,看看以前是否有人问过这个问题,但没有发现任何相同但接近的东西,所以就这样吧。
假设我有一个 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
不是一个选项的假设来提出这个问题吗?
我想这个问题中的另一个问题是两者之间的 Big-O 比较是什么?
这两个功能完全不同。性能无关紧要;他们不做同样的事情。
如果满足条件,第一个代码段会将适当的变量设置为 true
,如果不满足相应条件,则不执行任何操作,这意味着它保留原始值。
第二个代码段在每次迭代时为每个变量赋值。
所以第一个代码片段实际上是在询问每个数字 "is any value equal to this number",第二个代码片段实际上是在询问每个数字 "is the last value equal to this number"。我假设你想要前者,而不是后者,所以后者只是 错误。
嗯,在 integers
的情况下,当我的情况太多时,我真的很喜欢使用 switch
。 @ima 在 this 回答中对此进行了解释。否则,只有看起来更好或更重要 "readable"
然而,将 switch
与 strings
一起使用是一个完全不同的故事,如 this post 中所述。
请注意,这两种解决方案非常不同。第一个只将 true
分配给这四个变量中的 一个 ,而另一个将覆盖所有四个变量之前的任何值。
话虽如此,在第二个代码中使用三元运算符确实很糟糕。您可以直接分配比较结果:
w = value == 120;
x = value == 140;
y = value == 160;
z = value == 180;
撇开语义不谈,这也可能使它比 if/else 结构更高效。你可能认为只运行一次比较会更快,所以第一个解决方案应该更好,但实际上,分支can be slow。而且由于比较操作实际上非常快,只需将比较结果赋值四次就可能“更快”。
请注意,其中 none 实际上会对性能产生 真正的 影响。两者都是非常低级的,很可能您的应用程序代码中还有其他速度较慢的东西,更可能成为瓶颈。所以我不会强调在这里使用一种或另一种方式来提高性能;只需选择语义正确的内容,然后使用任何使语义尽可能清晰的解决方案。
I know a switch would easily defeat the both in terms of performance.
switch 语句与 if 和 else 链的效果相同,所以这里并没有什么区别。
I guess another question inside this question would be what are the Big-O comparisons between the two?
两者都是线性的,因为您只是循环遍历列表。所有其他差异都是不变的,因此在 Big-O 表示法中无关紧要。
我做了尽职调查,看看以前是否有人问过这个问题,但没有发现任何相同但接近的东西,所以就这样吧。
假设我有一个 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
不是一个选项的假设来提出这个问题吗?
我想这个问题中的另一个问题是两者之间的 Big-O 比较是什么?
这两个功能完全不同。性能无关紧要;他们不做同样的事情。
如果满足条件,第一个代码段会将适当的变量设置为 true
,如果不满足相应条件,则不执行任何操作,这意味着它保留原始值。
第二个代码段在每次迭代时为每个变量赋值。
所以第一个代码片段实际上是在询问每个数字 "is any value equal to this number",第二个代码片段实际上是在询问每个数字 "is the last value equal to this number"。我假设你想要前者,而不是后者,所以后者只是 错误。
嗯,在 integers
的情况下,当我的情况太多时,我真的很喜欢使用 switch
。 @ima 在 this 回答中对此进行了解释。否则,只有看起来更好或更重要 "readable"
然而,将 switch
与 strings
一起使用是一个完全不同的故事,如 this post 中所述。
请注意,这两种解决方案非常不同。第一个只将 true
分配给这四个变量中的 一个 ,而另一个将覆盖所有四个变量之前的任何值。
话虽如此,在第二个代码中使用三元运算符确实很糟糕。您可以直接分配比较结果:
w = value == 120;
x = value == 140;
y = value == 160;
z = value == 180;
撇开语义不谈,这也可能使它比 if/else 结构更高效。你可能认为只运行一次比较会更快,所以第一个解决方案应该更好,但实际上,分支can be slow。而且由于比较操作实际上非常快,只需将比较结果赋值四次就可能“更快”。
请注意,其中 none 实际上会对性能产生 真正的 影响。两者都是非常低级的,很可能您的应用程序代码中还有其他速度较慢的东西,更可能成为瓶颈。所以我不会强调在这里使用一种或另一种方式来提高性能;只需选择语义正确的内容,然后使用任何使语义尽可能清晰的解决方案。
I know a switch would easily defeat the both in terms of performance.
switch 语句与 if 和 else 链的效果相同,所以这里并没有什么区别。
I guess another question inside this question would be what are the Big-O comparisons between the two?
两者都是线性的,因为您只是循环遍历列表。所有其他差异都是不变的,因此在 Big-O 表示法中无关紧要。