PHP中的写写时间复制机制介绍
什么是抄写答:当一个对象的拷贝是不是真的要复制原始对象在内存中的另一个位置,在新对象的内存映射表设置一个指针但指向对象的源位置,并复制在内存写入位设置为1,在阅读的新对象执行的操作,内存中的数据没有任何变化,是直接进行读操作;在一个写操作实施的新对象,复制的真正对象到一个新的内存地址指向的内存映射表的新位置和修改新的对象,并执行写操作的内存位置。
这项技术需要与虚拟内存和分页一起使用。其优点是只在执行复制操作时建立指针,因为它不是真正的内存复制,因此大大提高了效率。如果复制了一个新对象,大多数对象都需要继续写操作,这将导致大量的分页错误,这将弊大于利,所以只有在复制了一个新对象,在内存分页的一小部分上写入时,才有效率。
在PHP内核中,我们还使用复制机制避免在赋值时增加内存。例如,我们可以发现的神秘,当我们使用foreach循环体。
复制代码代码如下所示:
M1 = memory_get_usage(美元);
$
aaaaaaaaaaaaaa
aaaaaaaaaaaaaa
aaaaaaaaaaaaaa
EOF;
$ ARR =爆炸(
$=0;
foreach($ ARR达v){
数+;
/ / $ V =aaaaaaaaaaaaaa;
}
M2 = memory_get_usage(美元);
回声$ M2 - M1;
执行此代码时,内存占用率为788。
复制代码代码如下所示:
M1 = memory_get_usage(美元);
$
aaaaaaaaaaaaaa
aaaaaaaaaaaaaa
aaaaaaaaaaaaaa
EOF;
$ ARR =爆炸(
$=0;
foreach($ ARR达v){
数+;
$ V = ' aaaaaaaaaaaaaa;
}
M2 = memory_get_usage(美元);
回声$ M2 - M1;
当我们取消 / / $ V =aaaaaaaaaaaaaa;注释,内存占用值是在这个时间:840,注意内存的增加。
复制代码代码如下所示:
M1 = memory_get_usage(美元);
$
aaaaaaaaaaaaaa
aaaaaaaaaaaaaa
aaaaaaaaaaaaaa
EOF;
$ ARR =爆炸(
$=0;
foreach($ ARR达v){
数+;
/ / $ V =aaaaaaaaaaaaaa;
}
M2 = memory_get_usage(美元);
回声$ M2 - M1;
当我们重写$ V在foreach为V,无论诠释的$ V循环体中的注释,我们可以得到内存:788
在参与的foreach循环牛的机制,当我们只看纯$ V操作,将PHP内核内存地址$ V内存地址的变量指向arr数组中的美元指数,而不是复制数组中的变量$ V的内存使用和美元V使用的数据是相同的。但当我们写$ V循环体中,复制机制被激活。此时,PHP将重新打开一个内存空间到$变量,原来的V的内存地址将被分解到数组中,然后内存将增长。
我们可以得出另一个结论:当我们读取大数据时,我们应该注意牛机制引入的内存增长效应,避免不必要的变量写入,从而提高代码的性能。