2013-07-05 188 views
7

PHP manual指出:

加3的$電流值的可寫入 '$一個+ = 3'。這 的意思是「取$ a的價值,加3,並將其返回 到$ a」。 除了更短更清晰之外,這也導致 更快執行。

我常想,$a += 3$a = $a + 3只是語法糖,因此他們應該在各方面等於

$a = $a + 3相比,爲什麼$a += 3的執行速度更快?

+0

的「垃圾場」,如果不出意外,這是略少代碼來解析。 –

+0

你是如何計時的?這將是有趣的知道... – CodeAngry

+0

我的猜測是你可以增加$ a而不是改變$ a到一個新的變量,只是3位數大 – exussum

回答

4

$a = $a + 3在臨時內存空間中將$ a加3,然後將結果賦值給$ a;而$a += 3直接將3加到$ a;這樣的區別是內存用於臨時存儲幾個字節,加上分配

+0

我不知道叫3次。'$ a = $ a + 3':將$ a複製到臨時內存空間,將3加到臨時內存空間的值中,用臨時內存空間的值覆蓋$ a的值; '$ a + = 3':加$ 3的值 - 不需要複製$ a到tempspace;無需將臨時空間值寫入$ a –

0

$a = $a + 3可能PHP VM使用一個臨時變量。 雖然$a += 3可能直接執行。

PS我強調這個威力。非常不知道...

這可能是類似於C++的:++ii++ :)

3

PHP是一種解釋,所以,爲了有一個性能好的代碼,它必須限制自己到不要做「有效」的複雜opimizations(編譯器可以做,因爲他們有時間)。
自集合者時間以來,最好有=+比其等價的總和,只是因爲它使用較少的資源。
在PHP的情況下,它將標記爲=+T_PLUS_EQUAL,最好也由PHP可執行文件執行,另一方面,總和,它被標記爲(和執行)就像一個總和。

下面從兩個token_get_all()

<?php echo '<pre>'; 

print_r(array_map(function($t){if(is_array($t)) $t[0]=token_name($t[0]); return $t;}, 
      token_get_all('<?php $a=$a+3 ?>'))); 

print_r(array_map(function($t){if(is_array($t)) $t[0]=token_name($t[0]); return $t;}, 
      token_get_all('<?php $a+=3 ?>'))); 

// results in: 
?> 

Array 
(
    [0] => Array 
     (
      [0] => T_OPEN_TAG 
      [1] => 1 
     ) 

    [1] => Array 
     (
      [0] => T_VARIABLE 
      [1] => $a 
      [2] => 1 
     ) 

    [2] => = 
    [3] => Array 
     (
      [0] => T_VARIABLE 
      [1] => $a 
      [2] => 1 
     ) 

    [4] => + 
    [5] => Array 
     (
      [0] => T_LNUMBER 
      [1] => 3 
      [2] => 1 
     ) 

    [6] => Array 
     (
      [0] => T_WHITESPACE 
      [1] => 
      [2] => 1 
     ) 

    [7] => Array 
     (
      [0] => T_CLOSE_TAG 
      [1] => ?> 
      [2] => 1 
     ) 

) 

Array 
(
    [0] => Array 
     (
      [0] => T_OPEN_TAG 
      [1] => 1 
     ) 

    [1] => Array 
     (
      [0] => T_VARIABLE 
      [1] => $a 
      [2] => 1 
     ) 

    [2] => Array 
     (
      [0] => T_PLUS_EQUAL  /// <= see here!!!!! 
      [1] => += 
      [2] => 1 
     ) 

    [3] => Array 
     (
      [0] => T_LNUMBER 
      [1] => 3 
      [2] => 1 
     ) 

    [4] => Array 
     (
      [0] => T_WHITESPACE 
      [1] => 
      [2] => 1 
     ) 

    [5] => Array 
     (
      [0] => T_CLOSE_TAG 
      [1] => ?> 
      [2] => 1 
     ) 

) 
相關問題