2009-09-16 152 views
2

什麼普遍較快是:比較效率

if (num >= 10) 

或:

if (!(num < 10)) 
+6

num> = 10,如果僅用於可讀性... – 2009-09-16 02:57:30

+1

用什麼語言? – 2009-09-16 03:07:22

回答

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表示計算機將執行兩個操作,而不是一個,因爲「或」在「大於或等於」。

+0

如果優化器沒有優化它,請獲得更好的編譯器! – 2009-09-16 18:20:01

11

任何像樣的編譯器將這些兩個語句優化完全相同的底層代碼。事實上,它很可能會產生完全相同的同一代碼:

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

只是因爲它的意圖似乎更清晰(輕度比你的第二個選擇更清楚我會選擇第一個你的,大規模更清晰的比我上面發佈的怪物)。我傾向於考慮如何閱讀它。想想這兩個句子:

  • 如果number大於或等於十。
  • 如果不是數字少於十的情況。

我相信第一個更清晰。

其實只是"gcc -s"測試,以獲取彙編輸出,兩個語句生成如下代碼:

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

我相信你是在浪費時間看微的優化這樣的 - 你會在查看算法選擇等方面效率更高。那裏可能有更大的投資回報。

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,但在第二個可能發出的第二指令以反轉的結果比較。(或者它可能只是使用一個分支,如果是零而不是分支,如果非零,一般不能說)

其他語言和編譯器會有所不同,對於類型他們真的具有相同語義的代碼可能完全相同。