php進階(二)—php寫時複製
阿新 • • 發佈:2020-12-20
在php的記憶體管理中有一個很重要的概念就是寫時複製(Copy on write),話不多說直接來程式碼
<?php $a = []; $index = 0; while(true){ $a [] = rand(1, 100); if(++$index == 1000000){ break; } } $b = $a; echo date('H:i:s') , ' Current memory usage: ' , (memory_get_usage(true) / 1024 / 1024) , " MB";
首先定義一個10萬隨機資料的陣列a,並定義一個變數b,使得b等於a,這時打印出記憶體佔用情況,記憶體佔用大約為34MB
接下來見證奇蹟的時刻,在上面的程式碼中加一行程式碼,隨意修改b陣列中的一個值
<?php $a = []; $index = 0; while(true){ $a [] = rand(1, 100); if(++$index == 1000000){ break; } } $b = $a; $b[0] = 1000; echo date('H:i:s') , ' Current memory usage: ' , (memory_get_usage(true) / 1024 / 1024) , " MB";
這時再檢視記憶體佔用情況,輸出結果如下,記憶體為66MB,幾乎是上面執行結果的兩倍。
從上面的程式碼示例,下面引出php寫實複製的概念,
寫時複製的定義為:寫時複製(Copy on Write,也縮寫為COW)的應用場景非常多, 比如Linux中對程序複製中記憶體使用的優化,在各種程式語言中,如C++的STL等等中均有類似的應用。 COW是常用的優化手段,可以歸類於:資源延遲分配。只有在真正需要使用資源時才佔用資源, 寫時複製通常能減少資源的佔用。
PHP中的COW可以簡單描述為:如果通過賦值的方式賦值給變數時不會申請新記憶體來存放 新變數所儲存的值,而是簡單的通過一個計數器來共用記憶體,只有在其中的一個引用指向變數的 值發生變化時才申請新空間來儲存值內容以減少對記憶體的佔用。 在很多場景下PHP都COW進行記憶體的優化。比如:變數的多次賦值、函式引數傳遞,並在函式體內修改實參等。