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

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,当然这仅仅是推测,未经证实。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值