位置: 编程技术 - 正文

PHP数组内存利用率低和弱类型详细解读(php内置数组)

编辑:rootadmin

推荐整理分享PHP数组内存利用率低和弱类型详细解读(php内置数组),希望有所帮助,仅作参考,欢迎阅读内容。

文章相关热门搜索词:php数组存储结构,php数组存入数据库,php的数组里面可以存储任意类型的数据,php数组内置的排序方法,php数组内置的排序方法,php数组内置的排序方法,php内置数组,php数组存储结构,内容如对您有帮助,希望把文章链接给更多的朋友!

这两天任务提前完成,可以喘口气沉淀一下,深入学习学习PHP。其实本来是想了解一下PHP性能优化相关的东西,但被网上的一句“PHP数组内存利用率低,C语言MB的内存数组,PHP里需要1G”惊到了。PHP真的这么耗内存么?于是借此机会了解了PHP的数据类型实现方式。

先来做个测试:

所得结果:

argv:.bytes

个元素的整数数组耗费内存( - )字节,约合KB,也就是说每个元素所占内存字节。在C语言中,一个int占位是4字节,整体相差了倍。

但是网上又说memery_get_usage()返回的结果不全是数组占用,还包括PHP本身的一些结构,因此,换种方式,采用PHP内置函数生成数组试试:

输出为:

argv:.byte

PHP数组内存利用率低和弱类型详细解读(php内置数组)

比刚才略好,但也字节,确实差了倍左右。

究其原因,还得从PHP的底层实现说起。PHP是一种弱类型的语言,不分int,double,string之类的,统一一个'$'就能解决所有问题。PHP底层由C语言实现,每个变量都对应一个zval结构,其详细定义为:

PHP使用union结构来存储变量的值,zval中zvalue_value类型的value变量即为一个union,定义如下:

union类型占用内存的大小有其最大的成员所占的数据空间决定。在zvalue_value中,str结构体的int占4字节,char指针占4字节,故整个zvalue_value所占内存为8字节。

zval的大小即为8 + 4 + 1 + 1 = 字节。

注意到zvalue_value中还有一个HashTable是做什么的?zval中,数组、字符串和对象还需要另外的存储结构,数组的存储结构即为HashTable。

HashTable定义给出:

除了几个记录table大小,所含元素数量的属性变量外,Bucket被多次使用到,Bucket是如何定义的:

有点像一个链表,Bucket就像是一个链表节点,有具体的数据和指针,而HashTable就是一个array,保存着一串Bucket元素。PHP中多维数组的实现,不过就是Bucket里面存着另一个HashTable罢了。

算一算HashTable需要占用个字节,Bucket需要个字节。一个空的数组就需要占用 + + = 个字节。Bucket 结构需要 个字节,键长超过四个字节的部分附加在 Bucket 后面,而元素值很可能是一个 zval 结构,另外每个数组会分配一个由 arBuckets 指向的 Bucket 指针数组, 虽然不能说每增加一个元素就需要一个指针,但是实际情况可能更糟。这么算来一个数组元素就会占用 个字节,与上面的估算几乎一样。

从空间的角度来看,小型数组平均代价较大,当然一个脚本中不会充斥数量很大的小型数组,可以以较小的空间代价来获取编程上的快捷。但如果将数组当作容器来使用就是另一番景象了,实际应用经常会遇到多维数组,而且元素居多。比如k个元素的一维数组大概消耗k内存,而k x 的二维数组理论上只需要 6M 左右的空间,但是按照 memory_get_usage 的结果则两倍于此,[k,5,2]的三维数组居然消耗了M,小型数组确实是划不来的。

PHP数组内存利用率低的原因,讲到这里,接下来的文章将解读PHP数组操作的具体实现。

标签: php内置数组

本文链接地址:https://www.jiuchutong.com/biancheng/289972.html 转载请保留说明!

上一篇:Laravel实现定时任务的示例代码(laravel定时任务如何实现的)

下一篇:CI框架(CodeIgniter)公共模型类定义与用法示例(ci框架文档)

  • 广播影视服务税率2023
  • 收据大写十万元整怎么写标准
  • 每月企业所得税申报截止到几号
  • 累计缴税扣除额
  • 仓库打包用的物品计什么科目
  • 退税发票误勾选怎么撤销
  • 社保缴费基数的组成部分
  • 企业预缴的增值税收入算不算企业的销售收入
  • 预算外资金收入政府会计
  • 生产企业购进的用于生产的机器设备
  • 2018年小规模优惠政策
  • 打官司失败了要赔偿原告诉讼费吗?
  • 企业收到预收账款,能不能给购买方开具发票
  • 材料的销售成本计算公式
  • 生产共同费用每个月都有摊销吗?
  • 税控系统技术维护费抵扣如何填报
  • 餐饮发票增值税税率是多少
  • 小规模税局代增值税专用发票怎么交税
  • 如何查找使用过的手机号
  • 季报表利润表本月怎么算
  • 个人缴纳工会费可以在工资里面扣交吗
  • 事业单位固定基金属于什么科目
  • 企业的营业外收入包括
  • 支付工程款不得超60天
  • 供热公司向用户提供
  • 公司之间银行往来款怎么做账
  • 进项税额转出会计处理
  • window10环境变量
  • 没有社保的工人怎么办
  • 企业收到利息收入开发票吗
  • 全部投资内部收益率
  • 销售出库未开票怎么入账
  • 局域网的工作模式及特点
  • 税务退回城建税期末怎么结转
  • 一个药厂能够生产药品的三个前提条件
  • php get post
  • php数组函数有哪些
  • 关于javascript
  • 营业外收支计算公式
  • 华为心率血压智能手表怎么样
  • 罚款属于应付账款吗
  • des算法加密解密过程
  • lvs命令
  • 如何查询发票领到几月份了
  • 驱动开发做得长久吗
  • 印花税的税率变动
  • 个人所得税累计收入怎么算
  • 股东以固定资产入股会计处理
  • 公司注销前怎么平账需要提前多久
  • 残保金申报方式改变时间
  • 普通发票记账联丢了怎么解决
  • 什么是年化收益和绝对利率
  • 冲去年管理费用
  • 申报残保金的时候有处罚决定书怎么办
  • 清算中的企业能恢复吗
  • 企业职工薪酬如何确定
  • 出口汇率按报关价格算吗
  • 旅客运输进项税申报漏了
  • 饭店会计做账流程
  • 会计交接事项有哪些
  • mysql中汉字用什么类型
  • xp系统怎么打开设置
  • winxp开机画面自动重启
  • win7系统开启无线服务
  • linux i3桌面
  • CentOS安装scp命令详解
  • iconindex什么意思
  • 如何在linux系统中创建空文件
  • jusearch是什么程序
  • 在linux系统中获取帮助信息的命令为
  • opengl es programming guide
  • 控制数值颜色
  • jquery开发
  • echarts.on
  • 如何用虚拟号码打电话
  • 单例类python
  • 从零基础开始
  • angularjs常用总结
  • Python装饰器入门学习教程(九步学习)
  • 国税三所电话
  • 免责声明:网站部分图片文字素材来源于网络,如有侵权,请及时告知,我们会第一时间删除,谢谢! 邮箱:opceo@qq.com

    鄂ICP备2023003026号

    网站地图: 企业信息 工商信息 财税知识 网络常识 编程技术

    友情链接: 武汉网站建设