最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

PHP中copy on write寫時復制機制介紹

 更新時間:2014年05月13日 11:36:09   作者:  
這篇文章主要介紹了PHP中copy on write寫時復制機制介紹,需要的朋友可以參考下

什么是寫時復制(Copy On Write)?

答:在復制一個對象的時候并不是真正的把原先的對象復制到內存的另外一個位置上,而是在新對象的內存映射表中設置一個指針,指向源對象的位置,并把那塊內存的Copy-On-Write位設置為1.這樣,在對新的對象執(zhí)行讀操作的時候,內存數據不發(fā)生任何變動,直接執(zhí)行讀操作;而在對新的對象執(zhí)行寫操作時,將真正的對象復制到新的內存地址中,并修改新對象的內存映射表指向這個新的位置,并在新的內存位置上執(zhí)行寫操作。

這個技術需要跟虛擬內存和分頁同時使用,好處就是在執(zhí)行復制操作時因為不是真正的內存復制,而只是建立了一個指針,因而大大提高效率。但這不是一直成立的,如果在復制新對象之后,大部分對象都還需要繼續(xù)進行寫操作會產生大量的分頁錯誤,得不償失。所以COW高效的情況只是在復制新對象之后,在一小部分的內存分頁上進行寫操作。

在PHP 內核中同樣使用了寫時復制機制來避免在賦值時導致內存增加,比如我們在使用foreach循環(huán)體時,可以發(fā)現(xiàn)其中的奧秘,示例代碼:

復制代碼 代碼如下:

$m1 = memory_get_usage();
$str=<<<EOF
aaaaaaaaaaaaaa
aaaaaaaaaaaaaa
aaaaaaaaaaaaaa
EOF;
$arr = explode("\n", $str);
$count=0;
foreach($arr as $v){
    $count++;
    //$v='aaaaaaaaaaaaaa';
}
$m2 = memory_get_usage();
echo $m2-$m1;

當我們執(zhí)行此代碼時會得到內存占用為:788

復制代碼 代碼如下:

$m1 = memory_get_usage();
$str=<<<EOF
aaaaaaaaaaaaaa
aaaaaaaaaaaaaa
aaaaaaaaaaaaaa
EOF;
$arr = explode("\n", $str);
$count=0;
foreach($arr as $v){
$count++;
$v='aaaaaaaaaaaaaa';
}
$m2 = memory_get_usage();
echo $m2-$m1;

當我們取消 //$v='aaaaaaaaaaaaaa';  的注釋,此時內存占用數值為:840,注意內存增長了。

復制代碼 代碼如下:

$m1 = memory_get_usage();
$str=<<<EOF
aaaaaaaaaaaaaa
aaaaaaaaaaaaaa
aaaaaaaaaaaaaa
EOF;
$arr = explode("\n", $str);
$count=0;
foreach($arr as &$v){
$count++;
//$v='aaaaaaaaaaaaaa';
}
$m2 = memory_get_usage();
echo $m2-$m1;

當我們將foreach中的$v 改寫為 &$v 時,不管是否注釋循環(huán)體中對$v的注釋,我們都可以得到內存占用為:788

這里就說明了COW機制的介入,當我們在foreach循環(huán)中純粹的只用到對$v 的讀操作時,PHP內核會將$v這個變量的內存地址指向到$arr中數組這一索引的內存地址,并沒有將數組中的數據復制一份給到變量$v,此時內存占用情況和使用&$v 是一樣的。但當我們在循環(huán)體內對$v進行寫操作時,寫時復制機制就被激活了,此時PHP會重新開辟一段內存空間給到$v變量,而將原先$v指向數組的內存地址給斷開了,此時內存必然就會增長了。

這里可以得出另外一個結論:當我們在讀取大數據的時候,要注意COW機制引入的內存增長影響,同樣避免不必要的對變量寫,可以提高代碼運行性能。

相關文章

  • 實現(xiàn) win2003 下 mysql 數據庫每天自動備份

    實現(xiàn) win2003 下 mysql 數據庫每天自動備份

    這篇文章主要為大家介紹下,如果用批處理實現(xiàn)mysql的自動備份,需要的朋友可以參考下
    2006-12-12
  • php數組對百萬數據進行排除重復數據的實現(xiàn)代碼

    php數組對百萬數據進行排除重復數據的實現(xiàn)代碼

    在平時的工作中,經常接到要對網站的會員進行站內信、手機短信、email進行群發(fā)信息的通知,用戶列表一般由別的同事提供,當中難免會有重復,為了避免重復發(fā)送,所以我在進行發(fā)送信息前要對他們提供的用戶列表進行排重,下面我以uid列表來講講我是如何利用php數組進行排重的。
    2010-06-06
  • 降低PHP Redis內存占用

    降低PHP Redis內存占用

    本文主要介紹了降低PHP Redis內存占用的方法。具有很好的參考價值。下面跟著小編一起來看下吧
    2017-03-03
  • php多數據庫支持的應用程序設計

    php多數據庫支持的應用程序設計

    以前做PHP應用,多數是單數據庫數據查詢和更新,頂多也是主從數據庫的支持,實現(xiàn)起來相對簡單。主從數據庫的問題在于,當會話存儲在數據庫的時候,同步將可能出現(xiàn)問題,也就是說有可能出現(xiàn)會話的中斷。
    2008-08-08
  • PHP使用file_get_content設置頭信息的方法

    PHP使用file_get_content設置頭信息的方法

    這篇文章主要介紹了PHP使用file_get_content設置頭信息的方法,結合實例形式對比分析了PHP使用fopen及file_get_contents設置及獲取頭信息的相關技巧,需要的朋友可以參考下
    2016-02-02
  • php中json_decode()和json_encode()的使用方法

    php中json_decode()和json_encode()的使用方法

    json_decode對JSON格式的字符串進行編碼而json_encode對變量進行 JSON 編碼,需要的朋友可以參考下
    2012-06-06
  • php中cookie的作用域

    php中cookie的作用域

    注意cookie的作用域:
    2008-03-03
  • php中時間軸開發(fā)(剛剛、5分鐘前、昨天10:23等)

    php中時間軸開發(fā)(剛剛、5分鐘前、昨天10:23等)

    php中時間軸開發(fā),即顯示為“剛剛”、“5分鐘前”、“昨天10:23”等
    2011-10-10
  • 調試PHP程序的多種方法介紹

    調試PHP程序的多種方法介紹

    這篇文章主要介紹了調試PHP程序的多種方法介紹,本文講解了PHP自帶的調試功能、引進調試工具、調試業(yè)務邏輯錯誤、調試非功能性的錯誤等內容,需要的朋友可以參考下
    2014-11-11
  • php數組保存文本與文本反編成數組實例

    php數組保存文本與文本反編成數組實例

    這篇文章主要介紹了php數組保存文本與文本反編成數組的方法,通過兩個自定義函數string2array與array2string實例展示了php數組保存文本與文本反編成數組的實現(xiàn)方法,具有不錯的參考借鑒價值,需要的朋友可以參考下
    2014-11-11

最新評論

巨野县| 东乡| 安乡县| 禹州市| 双江| 四子王旗| 永宁县| 巴青县| 曲沃县| 石门县| 平江县| 都江堰市| 中方县| 田东县| 甘德县| 商洛市| 定西市| 万源市| 富宁县| 原阳县| 上饶市| 射阳县| 罗城| 三江| 富民县| 宾阳县| 扎鲁特旗| 务川| 合肥市| 西盟| 金华市| 金阳县| 高安市| 门头沟区| 浦北县| 伊通| 招远市| 宜川县| 方正县| 周口市| 安塞县|