我想知道语言是否存在很大的性能差异,是否应该在if
或else
子句中更有可能执行代码。这是一个例子:
// x is a random number, or some key code from the user
if(!somespecific_keycode)
do the general stuff
else
do specific stuff
和另一个解决方案
if(somespecific_keycode)
do the specific stuff
else
do general stuff
答案 0 :(得分:7)
希望将它们置于使代码更清晰的顺序中,这通常更有可能首先执行。
答案 1 :(得分:7)
正如其他人所说:在性能方面,你最好依靠你的编译器和硬件(分支预测,推测执行)来做正确的事。
如果您真的担心这两个对您没有帮助,GCC会提供builtin(__ builtin_expect),您可以用它来明确指出分支的预期结果。
在代码可读性方面,我个人更喜欢最重要的案例。
答案 2 :(得分:3)
除非遇到性能问题,否则请不要担心。
如果您遇到性能问题,请尝试切换它们并度量哪个变体更快,如果有的话。
答案 3 :(得分:1)
分支预测会导致其中一个更有可能,如果在循环内部会导致性能差异。但大多数情况下,如果你没有考虑汇编程度,你可以忽略它。
答案 4 :(得分:1)
通常的规则是首先考虑更可能的案例,它被认为更具可读性。
答案 5 :(得分:0)
它主要没有区别,但有时如果ifs正在检查某些内容是否为真,那么它更容易阅读和调试,而在不是这种情况时,else会处理。
答案 6 :(得分:0)
正如其他人所说的那样,除非你多次使用它(例如循环),否则它不会产生巨大的差异。在这种情况下,将最可能的条件放在首位,因为它将有最早的机会突破条件检查。
当你开始拥有许多'else if's时,它会变得更加明显。
答案 7 :(得分:0)
可能出现的任何差异与上下文的关系比与if-else
构造本身相关。所以你在这里做的最好的事情就是开发自己的测试来检测任何差异。
除非您正在优化已完成的系统或软件,否则我建议您避免过早优化。可能你已经听说过他们是邪恶的。
答案 8 :(得分:0)
使用现代优化C编译器的AFAIK,在生成的代码中如何组织if
或循环与实际分支指令之间没有直接关系。此外,不同的CPU具有不同的分支预测算法。
因此:
在看到与此代码相关的不良效果之前,请勿进行优化
如果您进行优化,测量和比较不同的版本
使用不同特征的实际数据进行绩效衡量
查看编译器在两种情况下生成的汇编代码。
答案 9 :(得分:0)
这不一定是性能问题,但我通常会从特定到一般来防止这样的情况:
int i = 15;
if(i % 3 == 0)
System.out.println("fizz");
else if(i % 5 == 0)
System.out.println("buzz");
else if(i % 3 == 0 && i % 5 == 0)
System.out.println("fizzbuzz");
以上代码永远不会说'fizzbuzz',因为15匹配i % 3 == 0
和i % 5 == 0
条件。如果你重新订购更具体的东西:
int i = 15;
if(i % 3 == 0 && i % 5 == 0)
System.out.println("fizzbuzz");
else if(i % 3 == 0)
System.out.println("fizz");
else if(i % 5 == 0)
System.out.println("buzz");
现在上面的代码在被更一般的条件阻止之前会达到“fizzbuzz”
答案 10 :(得分:0)
所有答案都有效。这是另外一个:
避免双重否定:如果不这个,那么,否则会让读者感到困惑。因此,对于给出的例子,我赞成:
if (somespecific_keycode) {
do_the_specific_stuff();
} else {
do_general_stuff();
}