三元 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"

然而,将 switchstrings 一起使用是一个完全不同的故事,如 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 表示法中无关紧要。