2013-06-06 47 views
2

我對PHP很新,我對IF語句有個疑問。if的用法更快嗎?

實施例1:

<?php 
if($a == 1){ 
    if($b == 1){ 
    echo 'test'; 
    } 
} 
?> 

實施例2:

<?php 
if($a == 1 && $b ==1){ 
    echo 'test'; 
} 
?> 

都具有相同的結果,但其中一個是快?它甚至重要嗎?

+3

如果你問「什麼是更快」,你通常可以自己測試它。只需大量(數十萬,數百萬等)並測量時間。 – Voitcus

+2

最終,對於這樣的細微事情,可讀性比任何輕微的優化都更重要。即使你正在處理一個需要優化的大型項目,你也可能在其他地方找到它,而不是輕微的語法。 – BLaZuRE

回答

5

這是不成熟的優化&微基準測試,你真的需要閱讀Don't be STUPID: GRASP SOLID!理解爲什麼我這麼說

但是,如果你想知道if($a == 1 && $b ==1)似乎更快,最PHP版本

See Benchmark

如果你想知道真正的區別,請看opcodes

第一個代碼:

line  # * op       fetch   ext return operands 
--------------------------------------------------------------------------------- 
    2  0 > IS_EQUAL           ~0  !0, 1 
     1 > JMPZ              ~0, ->7 
    3  2 > IS_EQUAL           ~1  !1, 1 
     3 > JMPZ              ~1, ->6 
    4  4 > ECHO              'test' 
    5  5 > JMP              ->6 
    6  6 > > JMP              ->7 
     7 > > RETURN             1 

謝勝利代碼

line  # * op       fetch   ext return operands 
--------------------------------------------------------------------------------- 
    2  0 > IS_EQUAL           ~0  !0, 1 
     1 > JMPZ_EX           ~0  ~0, ->4 
     2 > IS_EQUAL           ~1  !1, 1 
     3  BOOL            ~0  ~1 
     4 > > JMPZ              ~0, ->7 
    3  5 > ECHO              'test' 
    4  6 > JMP              ->7 
     7 > > RETURN             1 

你能看到如何用很小的差異相似。這就是爲什麼它沒有意義去擔心這個問題,但寫出了好的和可讀的代碼。

+0

我很驚訝5:JMP 6,6:JMP 7沒有優化。 – Voitcus

+1

@Voitcus在所有PHP版本中測試過,90%的時間第二個代碼更快http://3v4l.org/JamIk – Baba

+0

沒關係,我注意到了其他一些東西:在第一行代碼中,第5行是JMP到第6行,在第6行有JMP到第7行;爲什麼有6號線? – Voitcus

1

他們是一樣的 - 在這兩種情況下,如果第一個條件是錯誤的,第二個將不會被測試。

0

不,沒關係。運行環境通常會克服這種小小的性能調整。比如低效的算法或客戶端最佳實踐被忽略。

0

兩者都是一樣的,因爲PHP解釋器是「足夠聰明」來弄清楚的。

+0

使用案例: 1. a == 1 b == 1 - 兩個條件都將被測試 2. a == 1 b == x - 先測試,然後測試失敗 3. a == 2 b = = x - 第一個將被測試,這是條件b的結束將不會被考慮 –

1

兩者都是一樣的。沒有太多的代碼需要優化,甚至可以編寫來縮短語法。

<?php 
echo $a && b ? 'test' : ''; 
?> 

是否一樣。

我修改了一下巴巴的基準檢查速記語法的結果。

Results

+2

有人誰downvoted可以解釋這個職位有什麼問題? – Robert

+0

我還沒有downvoted,但這不是一個「哪個更快」的問題的答案。 – Voitcus

+2

是的,它是在第一句「兩個都是一樣的」。 – Robert

1

Preoptimization爲根,一切邪惡。

也就是說,您的第一段代碼速度要快一點(但同樣是最低限度的 - 不要費心去將代碼更改爲此 - 可讀性比通過更改您的代碼獲得的微小速度增量更重要條件

3,000,000 iterations of the first piece of code:〜0.9861679077秒
3,000,000 iterations of the second piece of code:〜1.0684559345秒

差異:〜0.0822880268秒每次迭代
差異:〜0.0000000274秒(或274納秒)

+0

這就是爲什麼我喜歡簡寫語法:) – Robert

+1

我想看看你的基準代碼....我不同意 – Baba

+0

@Baba檢查更新的答案。 – h2ooooooo