比较效率

时间:2009-09-16 02:56:03

标签: comparison performance

通常更快:

if (num >= 10)

或:

if (!(num < 10))

3 个答案:

答案 0 :(得分:25)

编译器很可能会优化那种东西。不要担心,在这种情况下只需编码清晰。

汇编语言通常具有>=<=的操作,这些操作与<>的步骤数相同。例如,使用Motorola 68k时,如果要比较数据寄存器%d0%d1以及%d0大于或等于%d1时的分支,你会说像:

cmp %d0, %d1  // compare %d0 and %d1, storing the result
              // in the condition code registers.
bge labelname // Branch to the given label name if the comparison
              // yielded "greater than or equal to" (hence bge)

认为a >= b意味着计算机将执行两个操作而不是一个操作,因为“或”在“大于或等于”中,这是一个常见的错误。

答案 1 :(得分:11)

任何体面的编译器都会将这两个语句优化为完全相同的底层代码。事实上,它很可能会产生完全相同的代码:

if (!(!(!(!(!(!(!(num < 10))))))))

我会选择你的第一个,因为它的意图似乎更清晰(比你的第二个选择更明确,大规模比我上面发布的那些怪物更清晰)。我倾向于考虑如何阅读它。想想这两句话:

  • 如果数字大于或等于十。
  • 如果不是这个数字小于10的情况。

我相信第一个更清楚。

实际上,只需使用"gcc -s"进行测试以获取汇编程序输出,两个语句都会生成以下代码:

cmpl $9,-8(%ebp) ; compare value with 9
jle .L3          ; branch if 9 or less.

我相信你在浪费时间看这样的微优化 - 你会更有效地看待算法选择等事情。那里的投资回报可能会大得多。

答案 2 :(得分:3)

一般来说,任何速度差异都无关紧要,但它们并不一定意味着完全相同。

在许多语言中,比较浮点值NaN对所有比较都返回false,因此如果num = NaN,则第一个为false,第二个为true。

#include <iostream>
#include <limits>

int main ( ) {
    using namespace std;

    double num = numeric_limits<double>::quiet_NaN();

    cout << boolalpha;
    cout << "( num >= 10 )      " << ( num >= 10 ) << endl;
    cout << "( ! ( num < 10 ) ) " << ( ! ( num < 10 ) ) << endl;

    cout << endl;
}

输出

( num >= 10 )      false
( ! ( num < 10 ) ) true

因此编译器可以使用单个指令在第一种情况下比较num和值10,但在第二种情况下可以发出第二条指令来反转比较结果。 (或者它可能只是使用一个分支,如果为零,而不是分支,如果非零,你不能说一般)

其他语言和编译器会有所不同,对于它们真正具有相同语义的类型,发出的代码可能完全相同。