PHP 之之 写时复制介绍(写时复制介绍(Copy On Write))
在开始之前,我们可以先看一段简单的代码:
复制代码 代码如下:
<?php //例一
$foo = 1;
$bar = $foo;
echo $foo + $bar;
?>
执行这段代码,会打印出数字2。从内存的角度来分析一下这段代码“可能”是这样执行的:分配一块内存给foo变量,里面存储
一个1; 再分配一块内存给bar变量,也存一个1,最后计算出结果输出。事实上,我们发现foo和bar变量因为值相同,完全可
以使用同一块内存,这样,内存的使用就节省了一个1,并且,还省去了分配内存和管理内存地址的计算开销。没错,很多涉
及到内存管理的系统,都实现了这种相同值共享内存的策略:写时复制
很多时候,我们会因为一些术语而对其概念产生莫测高深的恐惧,而其实,他们的基本原理往往非常简单。本小节将介绍
PHP中写时复制这种策略的实现:
写时复制(Copy on Write,也缩写为COW)的应用场景非常多, 比如Linux中对进程复制中内存使用的优化,在各种编程语言
中,如C++的STL等等中均有类似的应用。 COW是常用的优化手段,可以归类于:资源延迟分配。只有在真正需要使用资源
时才占用资源, 写时复制通常能减少资源的占用。
注: 为节省篇幅,下文将统一使用COW来表示“写时复制”;
推迟内存复制的优化推迟内存复制的优化
正如前面所说,PHP中的COW可以简单描述为:如果通过赋值的方式赋值给变量时不会申请新内存来存放新变量所保存
的值,而是简单的通过一个计数器来共用内存,只有在其中的一个引用指向变量的值发生变化时才申请新空间来保存值内容以
减少对内存的占用。在很多场景下PHP都COW进行内存的优化。比如:变量的多次赋值、函数参数传递,并在函数体内修改
实参等。
下面让我们看一个查看内存的例子,可以更容易看到COW在内存使用优化方面的明显作用:
复制代码 代码如下:
<?php //例二
$j = 1;
var_dump(memory_get_usage());
$tipi = array_fill(0, 100000, ‘php-internal’);
var_dump(memory_get_usage());
$tipi_copy = $tipi;
var_dump(memory_get_usage());
foreach($tipi_copy as $i){
$j += count($i);
}
var_dump(memory_get_usage());
//—–执行结果—–
$ php t.php
int(630904)
int(10479840)
int(10479944)
int(10480040)