Intro
PHP底層效能原理測試
指標&記憶體
測試版本:PHP 5
$data2 = $data;
$data3 = $data;
以第一行為例:此時的宣告記憶體配置等同於$data2 = &$data
,即記憶體不會因$data2
宣告而多複製產生,只有在相依變數產生異動(Assign Write)時才會有相應機制:
當$data
先產生異動
異動事件如:
$data[0] = 'modified';
$value = &$data[0];
異動前記憶體共用同一份$data
內容,以下為流程:
-
因為
$data
有相依變數,PHP會將異動前$data
的記憶體內容複製或保留至暫存區(Temp),自己使用新的內容進行異動。此時記憶體有兩塊內容:新的
$data
與舊的$data
內容 -
原本相依
$data
的變數($data2
與$data3
)轉擁有或轉指向這個暫存區(Temp)。 -
若
$data2
又發生異動,則會同第一步自己使用新的內容進行異動,此時$data3
為擁有暫存區(Temp)因為沒有其他相依變數。此時記憶體有三塊內容:
$data
,$data2
,$data3
內容 -
若
$data3
又發生異動,因為沒有相依變數,等於擁有內容則直接異動。以上在記憶體形成3塊由原生
$data
產出的內容,最後各自獨立。
Foreach Pointer
個人不偏好在foreach
內使用Pointer,本身Loop內也沒有必要使用Pointer優化。
弊端方面就是foreach
的特性,還會產生母變數記憶體複製的問題。