2013-07-05 24 views
7

PHP manual bang rằng:

Thêm 3 với giá trị hiện tại của $ một có thể được viết '$ ​​a + = 3'. Điều này có nghĩa là chính xác "lấy giá trị của $ a, thêm 3 vào nó và gán nó trở lại vào $ a". Ngoài việc ngắn hơn và rõ ràng hơn, điều này cũng cho kết quả là khi thực hiện nhanh hơn.

Tôi đã từng nghĩ rằng $a += 3 là đường chỉ đơn thuần là cú pháp cho $a = $a + 3 và do đó họ nên được bằng trong tất cả các khía cạnh.

Tại sao $a += 3 dẫn đến việc thực thi nhanh hơn so với $a = $a + 3?

+0

nếu không có gì khác, nó hơi ít mã để phân tích. –

+0

Làm thế nào để bạn có thời gian? Nó sẽ là thú vị để biết ... – CodeAngry

+0

đoán của tôi là bạn có thể tăng $ a thay vì thay đổi $ a thành một biến mới chỉ là 3 chữ số lớn hơn – exussum

Trả lời

4

$a = $a + 3 thêm 3 đến $ a vào bộ nhớ tạm thời, sau đó gán kết quả cho $ a; trong khi $a += 3 thêm 3 trực tiếp vào $ a; nên sự khác biệt là một vài byte của bộ nhớ để lưu trữ tạm thời, cộng với chuyển nhượng

+0

Tôi không chắc chắn về được gọi là 3 lần.'$ a = $ a + 3': sao chép $ a vào không gian bộ nhớ tạm thời, thêm 3 vào giá trị trong không gian bộ nhớ tạm thời, ghi đè giá trị của $ a với giá trị từ không gian bộ nhớ tạm thời; '$ a + = 3': thêm 3 vào giá trị $ a - không cần sao chép $ a đến tempspace; không cần viết giá trị tempspace lên $ a –

0

$a = $a + 3thể sử dụng một biến tạm thời trong PHP VM. Trong khi $a += 3có thể thực hiện trực tiếp.

PS: Tôi nhấn mạnh khả năng. Rất không chắc chắn ...

Nó có thể là tương tự như C++ 's: ++i vs i++ :)

3

PHP là một thông dịch viên, vì vậy, để có một buổi biểu diễn tốt cho tốt mã, nó phải hạn chế chính nó để không làm "hợp lệ" opimizations phức tạp (như trình biên dịch có thể làm, bởi vì họ có thời gian cho điều đó).
Kể từ thời điểm tập hợp, tốt hơn là có =+ so với số tiền tương đương của nó, chỉ vì nó sử dụng ít tài nguyên hơn.
Trong trường hợp của PHP, nó tokenizes =+ đến T_PLUS_EQUAL, cũng được thực thi tốt nhất bởi PHP thực thi, và mặt khác, tổng, tốt, nó được tokenized (và thực hiện) giống như một tổng.

Tiếp nối "bãi" từ cả hai 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 
     ) 

) 
Các vấn đề liên quan