php进阶(二)—php写时复制

  在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进行内存的优化。比如:变量的多次赋值、函数参数传递,并在函数体内修改实参等。   

 

posted on 2020-12-20 15:01  1450811640  阅读(128)  评论(0编辑  收藏  举报