2012-11-23 84 views
2

我一直在想,檢查數字是1還是更大時,最佳做法是什麼。

IF($foo > 0) 

OR

IF($foo >= 1) 

哪一個我應該使用?他們似乎都是一樣的。

+1

只有當$ foo是整數時它才起作用。 – ivankoni

+6

'0.001> 0'對'0.001> = 1' – Esailija

+0

@Esailija沒有想到這種情況,猜測失敗了我的整個問題。但是,如果我們只處理整個數字 –

回答

-1

當涉及到性能,你想用>=而不是>

我在僞基準:

for 100000x { 
    time result of 5 > 0 
} 

for 100000x { 
    time result of 5 >= 1 
} 

編輯:和威廉的意見建議時間整個for循環,這到底發生了什麼。我把所有的時間加在一起,這給了我一次同時完成整個for循環的完全相同的結果。所以基本上我也是這樣做的。 (FYI我爲基準威廉他的建議,它有相同的結果,相信我,我是工程師。)

我的結果:

  >     >= 
x100000 | 198.63224029541 | 191.68829917908 
In MS 

所以,當談到速度並且使用的是整數(請參閱上面的偉大答案!),>=會更快。但是,考慮後果!在100.000測試中只有7ms。但是,當你有幾百萬的記錄,以檢查...

編輯

運行基準測試一對夫婦多次後,我得到更大的差異。差異像10,15甚至20毫秒!沒有什麼改變,顯然我的處理器很忙,但很高興與大家分享。

+0

,我希望你沒有完全按照你的僞碼建議,因爲它不會是一個準確的測試。對每一次比較進行計時比實際比較花費更多時間,並且不準確。你最好做10萬次運行,然後把它作爲一個整體對100k> =運行進行計時。 –

+0

@WilliamLawnStewart Yup,這正是我所做的。我會改變它,我認爲這是有道理的。但可能它沒有.. – Jelmer

3

的最終正確的是:

if ($foo >= 1) { } 

很清楚,簡潔,適合你在它扔任何號碼類型(所有兩個)。

以下是整數的一些替代比較;順便說一句,他們沒有產生更好的表現(事實)或可讀性(在我看來)。

if ($foo) { 
    // anything that's not zero, regardless of sign 
} 

if ($foo != 0) { 
    // same as above, but forces the left operand to be casted to number 
} 

if ($foo > 0) { 
    // anything that's above zero and therefore greater or equal to one 
} 
0

如果你的要求是檢查值大於或等於1,然後竟然沒有在這裏做了一個決定。從邏輯和語義上講,只有的選擇是x >= 1

3
     -1  0  0.5  1 
IF($foo > 0)   false false true  true 
IF($foo >= 1)  false false false true 
IF($foo)    true false true  true 
0

這取決於您是使用整數還是浮點數。

基於性能優勢選擇一點是沒有意義的。

看到Jelmer的說法後,我寫了一個基準來測試一下,看看是否有意義的區別。

這裏是我跑的基準確切的代碼:

<?php 

echo '&gt;= VS &gt;<br/>'; 

for($j = 0; $j < 100; $j++) 
{ 

    $start = microtime(true); 

    for($i = 1000000; $i > 0; $i--) 
    { 

    } 

    $midpoint = microtime(true); 

    for($i = 1000000; $i >= 1; $i--) 
    { 

    } 

    $end = microtime(true); 

    $with_equals = $end - $midpoint; 
    $no_equals = $midpoint - $start; 

    echo $with_equals.' VS '.$no_equals.'<br/>'; 

    if($with_equals < $no_equals) 
    { 
     $with_equals_wins++; 
    } 
    elseif($with_equals > $no_equals) 
    { 
     $no_equals_wins++; 
    } 

} 

echo '<br/>TOTAL WINS<br/>&gt;= - '.$with_equals_wins.' VS &gt; - '.$no_equals_wins; 

在運行Windows 7 x64和XAMPP 1.7.3我的英特爾酷睿i7 Sandy Bridge的筆記本電腦,我然後跑基準幾次,得到了以下結果:(我確信關閉睿頻加速,使CPU的時鐘都是穩定的)

TOTAL WINS 
>= - 26 VS > - 74 

TOTAL WINS 
>= - 21 VS > - 79 

TOTAL WINS 
>= - 22 VS > - 78 

請注意,我的結果是什麼Jelmer得到了相反的。

如果存在任何一種甚至稍有意義的性能差異,那麼它可能取決於代碼運行的特定硬件和軟件環境。