2013-07-05 190 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 
     ) 

) 
相关问题