如果,除此之外,我应该把更可能的部分放在哪里?

时间:2012-08-01 16:37:56

标签: c if-statement flow-control

我想知道语言是否存在很大的性能差异,是否应该在ifelse子句中更有可能执行代码。这是一个例子:

// 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

11 个答案:

答案 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 == 0i % 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();
    }