为什么$ a + = 3的执行速度比$ a = $ a + 3快?

时间:2013-07-05 16:18:41

标签: php expression

PHP manual声明:

  

在$ a的当前值中加3可以写成' $ a + = 3'。这个   准确地说"取$ a的值,加3,然后再分配   进入$ a"。 除了更短更清晰之外,还会产生这种结果   加快执行速度。

我曾经认为$a += 3仅仅是$a = $a + 3的语法糖,因此它们在所有方面都应该相等

$a += 3相比,为什么$a = $a + 3会导致执行速度更快?

3 个答案:

答案 0 :(得分:4)

$a = $a + 3在临时内存空间中添加3到$ a,然后将结果分配给$ a;而$a += 3直接将3加到$ a;所以差异是用于临时存储的几个字节的内存,加上一个赋值

答案 1 :(得分:3)

PHP是一名翻译,因此,为了良好代码具有良好性能,它必须将自己限制为不要做“有效”的复杂选择(因为编译器可以做,因为他们有时间)。
从集合体的时间开始,最好是=+而不是它的等价金额,因为它使用的资源更少。
在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
        )

)

答案 2 :(得分:0)

$a = $a + 3 可能 PHP VM 中使用临时变量。 虽然$a += 3 可能直接执行。

PS 我强调可能性。非常不确定......

可能类似于C++++ii++:)