PHP对数组内存的零散管理特点

来源:互联网 发布:网络直播背后的思考 编辑:程序博客网 时间:2024/05/22 15:53

PHP作为一门解释型的脚本语言,虽然从执行效率上比静态语言有一些差距,但是自身有很多有趣且实用的特点。

今天我们就来看一看PHP对数组内存的管理与C++等静态语言的区别。


我们先来看下面一段code

<?phpecho memory_get_usage();$arr=array();$arr[0]=5;echo memory_get_usage();$arr[200000]=5;echo memory_get_usage();?>
执行结果如下

248520248944249072
分析

大家可以看到为索引为200000的元素赋值并没有导致内存消耗的激增。

从而说明PHP对数组内存的管理具有零散的特点。

它并不会像C++一样开辟一个数组需要事先定义好数组数量,并开辟容纳所有元素的整片内存。


PHP这样的特点有何实用价值

我们拿查找N度人脉的功能作为一个例子。

求N度人脉实际上是利用矩阵求解关系的传递闭包。第i度的人脉矩阵需要依靠第i-1度的人脉矩阵计算得出。

一个存储10万人的关系需要100000*100000*sizeof(char)大小的矩阵。

在计算峰值时需要在内存中同时存储2个这样大小的二维数组,这无疑对内存的消耗很大。

不过关系矩阵有2个显著的特点:

1、它是一个对称型矩阵(这意味着我们只关注矩阵对角线的半边)

2、它是一个稀疏矩阵(这意味着我们只关注那些为1的值)

如何避免开辟那些我们不关心的值得内存,从而使得程序的内存使用率大大降低呢?

这个问题利用C++解决可能还不是那么容易,但是利用PHP对数组内存的零散管理的特点就迎刃而解了。


PHP如何实现该特点的推测

PHP中的每一个声明的数组其实是某一数据类型指针的Map,当然这仅仅是推测,未经证实。

0 0
原创粉丝点击