在 if 语句内继续循环与在循环内使用 if 语句的否定
Posted
技术标签:
【中文标题】在 if 语句内继续循环与在循环内使用 if 语句的否定【英文标题】:Continue loop Inside if statement vs. using the negation of the if statment inside the loop 【发布时间】:2011-05-14 14:15:28 【问题描述】:例如,让我们考虑以下 2 个代码:
for (i = 0; i < 1000; i++)
if ( i % 2 != 0)
continue;
else
...
和
for (i = 0; i < 1000; i++)
if (i % 2 == 0)
...
两者都会导致相同的结果。那么使用哪一个呢?哪一个更好?两者之间是否存在显着的性能差异?让我们看看你们对此有何看法。我喜欢我在这里看到的关于这些事情的讨论。这可能会导致更好的代码编写和更好的执行时间。我发布了这个问题,因为我没有找到答案。如果我没有找到答案,我将来可能会发布另一个这样的问题。
附:当你可以不使用 continue 时,在循环中使用 continue 的目的是什么?
【问题讨论】:
for(i = 0; i < 1000; i+=2)
还是更好。 continue
的目的是当你的循环中有复杂的决策路径时。
好的答案和cmets。此外,这严格来说是一个微优化问题。恕我直言,真正的性能调整从 macro-optimization 开始。
【参考方案1】:
在这个具体的例子中?使用continue
没有任何意义。
正如您所提到的,两个代码示例产生完全相同的结果。而且两者都不会比另一个更快。
您应该根据可读性和清晰度来决定更喜欢哪一个,而不是某种误导性的“优化”尝试。考虑到这一点,第二个就远更清楚了。我会认真质疑在真实代码库中使用第一个的人的编程能力。
作为基本准则,当单个 if
可以使用时,切勿使用 if-else
。在这种情况下,您正在比较 !=
,然后使用 else
语句找到与之相反的结果——这几乎就像说 !(!=)
一样,会产生双重否定。很难阅读或理解。一般来说,您应该尝试在if
语句中评估肯定条件,而不是否定条件,以防止这种情况发生。
而且确实没有理由发布与此类似的其他问题。所有的答案都是一样的。忽略任何可能的性能差异(如果甚至存在,考虑到优化编译器,这不太可能),并专注于哪个版本对您作为必须阅读它的人最有意义。请忽略任何给你相反建议的人。
【讨论】:
是的,著名的 if (!isNotX) 情况 - 遵循这样的逻辑总是很有趣。【参考方案2】:我绝对不会考虑第一个选项,因为我认为它会在流程中添加不必要的代码路径。我不认为它会在性能方面带来更好的结果,但是如果您想确保可以检查 IL 代码。
【讨论】:
只有在我们谈论 C# 时才会有 IL 代码,问题中没有指定。 假设一旦代码被编译/JIT 编译,就会有一个额外的路径,这并不准确。您必须实际编译它,看看您的编译器是否如此愚蠢。当然,我非常怀疑这是真的。现在编译器通常比我们程序员聪明。【参考方案3】:没有足够的差异来证明使用丑陋的形式是合理的。
在这个特定的例子中比任何一个都好
For(i = 0; i < 1000; i+=2)
...
因为根本不需要可分性检查。
【讨论】:
以上是关于在 if 语句内继续循环与在循环内使用 if 语句的否定的主要内容,如果未能解决你的问题,请参考以下文章