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

时间:2012-12-12 12:13:02

标签: c++ c if-statement

我想知道,如果我们有if-else条件,那么检查计算效率更高:使用等于运算符或不等于运营商?是否有任何区别?

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

情况1:

if (a == x)
{
    // execute Set1 of statements
}
else
{
    // execute Set2 of statements
}

案例2:

if (a != x)
{
    // execute Set2 of statements
}
else
{
    // execute Set1 of statements
}

这里假设大部分时间(例如90%的情况)a将等于xax都是无符号整数类型。

14 个答案:

答案 0 :(得分:10)

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

答案 1 :(得分:9)

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

在性能方面没有差异,因为代码很可能编译成同一个东西。 (当然应该在JIT for Java中)

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

答案 2 :(得分:7)

在这个简单的例子中,它没有任何区别。 (假设ax是基本类型)如果它们是具有重载operator ==operator !=的类类型,它们可能会有所不同,但我不担心它

对于后续循环:

if ( c1 )   { }
else if ( c2 ) { }
else ...

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

答案 3 :(得分:5)

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

if (__builtin_expect(expression, 1))
…

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

答案 4 :(得分:3)

没有区别。

x86 CPU架构有两个用于条件跳转的操作码

JNE (jump if not equal)
JE (jump if equal)

通常它们都占用相同数量的CPU周期。

即使他们不这样做,你也可以期望编译器为你做这些微不足道的优化。写出最具可读性的内容,使你的意图更加清晰,而不是担心微秒。

答案 5 :(得分:3)

如果您曾经设法编写一段可以被证明比另一种更有效的Java代码,那么您应该发布您的结果,并针对您发现差异的任何实现提出问题。

更重要的是,只是提出这样的问题应该是一个有问题的迹象:这表明你正在把注意力和精力集中在代码的错误方面。真实的应用程序性能总是受到架构不足的影响; 从不来自此类问题。

答案 6 :(得分:2)

  

早期优化是万恶之源

即使对于分支预测,我认为你不应该太在意这一点,直到真的有必要。

正如彼得所说,用最简单的方法。

答案 7 :(得分:2)

让编译器/优化器完成它的工作。 一般的经验法则(现在大多数情况下)源代码应以最易读的方式表达您的意图。你将它写给另一个人(而不是计算机),一年后你自己或你的队友需要用更少的努力来理解你的代码。

答案 8 :(得分:1)

它不应该在性能方面有任何不同,但你会考虑最容易阅读的内容。然后,当您回顾您的代码或者有人正在查看它时,您希望它易于理解。

答案 9 :(得分:0)

如果第一个条件是在大多数情况下为真的条件,那么它具有一点优势(从可读性的角度来说)。 以最佳方式阅读条件的方式写出条件。你不会因为否定一个条件而受益于速度

答案 10 :(得分:0)

大多数处理器使用电门进行相等/不等式检查,这意味着一次检查所有位。因此它应该没有区别,但是你想要真正优化你的代码,最好自己对事物进行基准测试并检查结果 如果你想知道是否值得这样优化,想象你会对屏幕中的每个像素进行多次检查,或者像这样的场景。 Imho,它是值得优化的,即使它只是教自己好习惯;)

答案 11 :(得分:0)

只有你在第一次使用的非负面方法似乎是最好的。

答案 12 :(得分:0)

唯一可以确定的方法是对两个版本进行编码并衡量其性能。如果差异仅为百分之一左右,请使用更明确传达意图的版本。

非常你不太可能看到两者之间存在显着差异。

答案 13 :(得分:0)

它们之间的性能差异可以忽略不计。所以,只要考虑代码的可读性。为了便于阅读,我更喜欢在If语句中有更多代码行的那个。

if (a == x) { 
    // x lines of code
} else {
    // y lines of code where y < x
}