2013-10-11 72 views
3

這個問題可能是「有點在那裏」。但或多或少的是microbenching代碼,但它是提高我的標準和PHP後端的一般知識。PHP微代碼(變量與條件語句)

SO!我在這裏,我的問題!會調用變量兩次需要更少的內存(並在CPU上加載)比在PHP中調用額外的其他條件?哪個需要更多的資源?爲什麼?

下面的實施例:
,示出了調用的可變兩次並,示出了呼叫的附加else條件。 當然,最終結果都是

對任何答案(響應)的任何其他引用都將被高度佔用!如果可能的話。

實例A:

$a = 1; 
if (isset($array['a'])) 
{ 
    $a = $array['a']; 
} 

$b = NULL; 
if (isset($array['b'])) 
{ 
    $b = $array['b']; 
} 



例B:

if (isset($array['a'])) 
{ 
    $a = $array['a']; 
} 
else 
{ 
    $a = 1; 
} 

if (isset($array['b'])) 
{ 
    $b = $array['b']; 
} 
else 
{ 
    $b = NULL; 
} 
+0

有無疑是這個問題的答案,但它會沒有任何意義。速度的差異非常小,您無法在現代硬件上進行測量。 –

回答

1

我創建了一個迷你基準測試,看看哪個更快。 以下評估函數正好100次。 這兩個函數的內部,他們評估你的例子正好100,000次。 在我的主頁Ubuntu Web服務器上,輸出與此類似。

6.0754749774933 =賦予變量一個默認值。

4.8433840274811 =改用else語句。

第二個示例(else語句)速度提高了兩秒,但該示例正在執行10,000,000次(1000萬次)。在一個真實的例子中,代碼的可讀性和你的團隊喜歡什麼比保存幾毫秒更重要。

要回答你的問題,使用這兩種方法幾乎沒有區別。

如果你想要我的意見,我更喜歡第二個例子。

這是我使用的基準代碼。 http://phpfiddle.org/api/raw/8nm-d72

+0

非常有趣!不是4.84 <6.07?!那會比慢一點快兩秒嗎?這部分有點混亂。 – tfont

+1

你說得對。我將它改爲「更快」。 – Kayla

1

我沒有超時,但沒有在其他任何評價。如果你有其他的可能會有一些微小的差別。這個例子可能歸結爲可讀性和/或編碼偏好。

3

我有一種感覺,由這兩個生成的PHP操作碼對於大多數當前版本的php來說都是相同的或等同的。發揮它自己,看看:http://blog.ircmaxell.com/2012/07/the-anatomy-of-equals-opcode-analysis.html

爲了好玩,這裏是通過PHP 5.3倍生成例的操作碼:

2  0 > ASSIGN             !0, 1 
3  1  ZEND_ISSET_ISEMPTY_DIM_OBJ     1 ~1  !1, 'a' 
4  2 > JMPZ              ~1, ->6 
5  3 > FETCH_DIM_R          $2  !1, 'a' 
     4  ASSIGN             !0, $2 
6  5 > JMP              ->6 
8  6 > ASSIGN             !2, null 
9  7  ZEND_ISSET_ISEMPTY_DIM_OBJ     1 ~5  !1, 'b' 
10  8 > JMPZ              ~5, ->12 
11  9 > FETCH_DIM_R          $6  !1, 'b' 
     10  ASSIGN             !2, $6 
12 11 > JMP              ->12 
13 12 > > RETURN             1 

這裏的例子B:

2  0 > ZEND_ISSET_ISEMPTY_DIM_OBJ     1 ~0  !0, 'a' 
3  1 > JMPZ              ~0, ->5 
4  2 > FETCH_DIM_R          $1  !0, 'a' 
     3  ASSIGN             !1, $1 
5  4 > JMP              ->6 
8  5 > ASSIGN             !1, 1 
11  6 > ZEND_ISSET_ISEMPTY_DIM_OBJ     1 ~4  !0, 'b' 
12  7 > JMPZ              ~4, ->11 
13  8 > FETCH_DIM_R          $5  !0, 'b' 
     9  ASSIGN             !2, $5 
14 10 > JMP              ->12 
17 11 > ASSIGN             !2, null 
19 12 > > RETURN             1 

你已經得到了相同數量的正在處理的代碼行,相同數量的分配和跳轉。你只是略微改變了一下,但是看起來似乎唯一的區別是執行順序,而不是執行的實際命令。

1

忽視最小的性能差異,最好先定義一個變量。

PHP isnt類型安全(但),然而,想象你的例子B結果在2個不同類型的變量$ a。

if (isset($array['a'])) 
{ 
    $a = $array['a']; // could be a string or anything else 
} 
else 
{ 
    $a = 1; // is an integer 
} 

對於可能成爲問題的其他代碼中的嚴格條件。例如:假設$array['a']的值爲'1';

繼富爾德失敗:

if ($a === 1) // do something 

這裏一個類型和值必須匹配這將是TRUE只對上述其他情況下$a = 1;