10

我想知道语言是否存在很大的性能差异,是否应该将更有可能执行的代码放在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
4

11 回答 11

9

更喜欢将它们放在使代码更清晰的顺序中,这通常更有可能首先执行。

于 2012-08-01T16:41:25.097 回答
7

正如其他人所说:就性能而言,您最好依靠编译器和硬件(分支预测、推测执行)来做正确的事情。

如果您真的担心这两个对您的帮助不够,GCC 提供了一个内置函数 (__builtin_expect),您可以使用它明确指示分支的预期结果。

在代码可读性方面,我个人更喜欢最有可能的情况。

于 2012-08-01T16:42:26.610 回答
4

除非您遇到性能问题,否则不要担心。

如果您确实遇到性能问题,请尝试切换它们并测量哪个变体更快(如果有的话)。

于 2012-08-01T16:39:45.510 回答
2

常见的规则是把更可能的大小写放在第一位,它被认为更具可读性。

于 2012-08-01T16:40:35.557 回答
1

分支预测将导致其中一个更有可能发生,并且如果在循环内,它将导致性能差异。但大多数情况下,如果您不在汇编程序级别思考,您可以忽略这一点。

于 2012-08-01T16:39:33.040 回答
1

这不一定是性能问题,但我通常从特定到一般来防止这样的情况:

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 == 0andi % 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”

于 2012-08-01T16:43:32.967 回答
1

所有答案都有有效点。这是一个附加的:

  • 避免双重否定:如果不是这个,那就是那个,否则某些事情往往会让读者感到困惑。因此,对于给出的示例,我倾向于:

    if (somespecific_keycode) {
        do_the_specific_stuff();
    } else {
        do_general_stuff();
    }
    
于 2017-07-17T10:58:59.910 回答
0

它几乎没有什么区别,但有时如果您的 ifs 正在检查某事是否为真或相等,并且 else 在不是这种情况时处理,则有时更容易阅读和调试。

于 2012-08-01T16:41:10.323 回答
0

正如其他人所说,除非您多次使用它(例如在循环中),否则它不会产生巨大的影响。在这种情况下,将最有可能的条件放在第一位,因为它将有最早的机会突破条件检查。

当您开始有许多 'else if' 时,它变得更加明显。

于 2012-08-01T16:42:15.213 回答
0

可能出现的任何差异都与上下文有关,而不是与if-else结构本身有关。因此,您可以在这里做的最好的事情就是开发自己的测试来检测任何差异。

除非您正在优化已经完成的系统或软件,否则我建议您避免过早优化。可能你已经听说他们是邪恶的。

于 2012-08-01T16:42:29.247 回答
0

AFAIK 与现代优化 C 编译器没有直接关系,您如何组织您的ifor 循环和生成代码中的实际分支指令。此外,不同的 CPU 具有不同的分支预测算法。

所以:

  • 在看到与此代码相关的不良性能之前不要进行优化

  • 如果您确实优化、衡量和比较不同的版本

  • 使用不同特征的真实数据进行性能测量

  • 在这两种情况下查看编译器生成的汇编代码。

于 2012-08-01T16:43:14.487 回答