什么是有效的检查:等于或不等于?

jsi*_*ist 6 c c++ if-statement

我想知道,如果我们if-else有条件,那么检查计算效率更高:使用等于运算符还是不等于运算符?有什么不同吗?

例如,以下哪一项在计算上有效,下面的两种情况都会做同样的事情,但哪一种更好(如果有任何差异)?

情况1:

if (a == x)
{
    // execute Set1 of statements
}
else
{
    // execute Set2 of statements
}
Run Code Online (Sandbox Code Playgroud)

案例2:

if (a != x)
{
    // execute Set2 of statements
}
else
{
    // execute Set1 of statements
}
Run Code Online (Sandbox Code Playgroud)

这里的假设大部分时间(比如90%的情况)a将等于x.a并且x都是无符号整数类型.

Cro*_*rog 10

通常,您使用哪个操作员的性能无关紧要.但是,建议分支时if语句的最可能结果首先出现.

  • 正如AlexWien所提到的那样,通常最好以对读者更合乎逻辑的方式来编写它.如果你通常遇到第一种情况,你就不会获得太多收益,当一些CPU/GPU周期至关重要时,可以更有效地使用缓存. (2认同)

Pet*_*rey 10

通常你应该考虑的是; 编写此代码的最简单,最清晰的方法是什么?恕我直言,第一,积极是最简单的(不要求!)

在性能方面没有差异,因为代码可能编译成相同的东西.(当然在JIT for Java中它应该)

对于Java,JIT可以优化代码,因此分支预测首选分支.

  • @Mike:如果他们要制定这样的规则,它应该要求条件为正,而不是非负.否则,有人应该为规则制定者制定规则. (2认同)

Luc*_*ore 8

在这个简单的例子中,它没有任何区别.(假设a并且x是基本类型)如果它们是超载的类型operator ==或者operator !=它们可能不同,但我不担心它.

对于后续循环:

if ( c1 )   { }
else if ( c2 ) { }
else ...
Run Code Online (Sandbox Code Playgroud)

应该首先考虑最可能的条件,以防止对其他人进行无用的评估.(再次,这里不适用,因为你只有一个else).


Eri*_*hil 5

GCC提供了一种向编译器通知表达式可能结果的方法:

if (__builtin_expect(expression, 1))
…
Run Code Online (Sandbox Code Playgroud)

这个内置计算值的值expression,但它通知编译器可能的结果是1(true对于布尔值).要使用它,您应该expression尽可能清楚地写(对于人类),然后将第二个参数设置为最有可能是结果的值.