PHP作为一门解释型的脚本语言,虽然从执行效率上比静态语言有一些差距,但是自身有很多有趣且实用的特点。
今天我们就来看一看PHP对数组内存的管理与C++等静态语言的区别。
我们先来看下面一段code
<?php
echo memory_get_usage();
$arr=array();
$arr[0]=5;
echo memory_get_usage();
$arr[200000]=5;
echo memory_get_usage();
?>
执行结果如下
248520
248944
249072
分析
大家可以看到为索引为200000的元素赋值并没有导致内存消耗的激增。
从而说明PHP对数组内存的管理具有零散的特点。
它并不会像C++一样开辟一个数组需要事先定义好数组数量,并开辟容纳所有元素的整片内存。
PHP这样的特点有何实用价值
我们拿查找N度人脉的功能作为一个例子。
求N度人脉实际上是利用矩阵求解关系的传递闭包。第i度的人脉矩阵需要依靠第i-1度的人脉矩阵计算得出。
一个存储10万人的关系需要100000*100000*sizeof(char)大小的矩阵。
在计算峰值时需要在内存中同时存储2个这样大小的二维数组,这无疑对内存的消耗很大。
不过关系矩阵有2个显著的特点:
1、它是一个对称型矩阵(这意味着我们只关注矩阵对角线的半边)
2、它是一个稀疏矩阵(这意味着我们只关注那些为1的值)
如何避免开辟那些我们不关心的值得内存,从而使得程序的内存使用率大大降低呢?
这个问题利用C++解决可能还不是那么容易,但是利用PHP对数组内存的零散管理的特点就迎刃而解了。
PHP如何实现该特点的推测
PHP中的每一个声明的数组其实是某一数据类型指针的Map,当然这仅仅是推测,未经证实。