0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看技术视频
  • 写文章/发帖/加入社区
会员中心
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

PHP7在内存方面你是否知道都进行了哪些优化

冬至配饺子 来源:开发内功修炼 作者:张彦飞allen 2022-08-30 17:08 次阅读

前面我们讨论了内存的工作原理,也进行了一些性能相关的测试。那么今天开始我们来看几个在实践中的应用。首先我们先从PHP开始。2015年,PHP7的发布可以说是在技术圈里引起了不小的轰动,因为它的执行效率比PHP5直接翻了一倍。PHP7在内存方面,你是否知道作者都进行了哪些优化?几个核心结构体的改进只是表面上看起来优化的几个字节那么简单?让我们从几个核心的数据结构改进开始看起。

1 PHP7zval的变化

1、php5.3中的zval:

pYYBAGMN0taADI7ZAACph_e53O8634.png

我们这里只讨论64位操作系统下的情况。该zval_struct结构体中的由四个成员构成,其中zvalue_value稍微复杂一些,是一个联合体。联合体中最长的成员是一个指针加一个int,8+4=12字节。但是默认情况下,会进行内存对齐,故zval_struct会占用16字节。那么。

_zval_struct总的字节 = value(16)+ refcount__gc(4)+ type(1)+ is_ref__gc(1)= 占用22字节。

最后再考虑下内存对齐,实际占用24字节。(如果算的有点晕话,感兴趣的同学可以写段简单的测试代码,使用sizeof查看一下)

2、PHP7.2中的zval

poYBAGMN0uyAUol1AADs2EZskZs450.png

7.2中的zval_struct结构体里由3个成员构成,其中zend_value看起来比较复杂,实际上只是一个8字节的联合体。u1也是一个联合体,占用是4个字节。u2也一样。这样zval_struct就实际占用16个字节。

2 PHP7 HashTable的变化

1、PHP5.3里的HashTable:

pYYBAGMN0v-AGU2NAACNlGKBu8M639.png

在5.3里HashTable就是一个大struct, 有点小复杂,我们拆开了细说,

uint nTableSize 4字节

uint nTableMask 4字节

uint nNumOfElements 4字节,

ulong nNextFreeElement 8字节 注意这前面的4个字节会被浪费掉,因为nNextFreeElement的开始地址需要对齐

Bucket *pInternalPointer 8字节

Bucket *pListHead 8字节

Bucket *pListTail 8字节

Bucket **arBuckets 8字节

dtor_func_t pDestructor 8字节

zend_bool persistent 1字节

unsigned char nApplyCoun 1字节

zend_bool bApplyProtection 1字节

最终,总字节数 = 4+4+4+4(nNextFreeElement前面这四个字节会留空)+8+8+8+8+8+8+1+1+1 = 67字节。再加上结构体本身要对齐到8的整数倍,所以实际占用72字节。

2、PHP7.2里的HashTable:

pYYBAGMN0xKAQDrkAACWEr2NQKE768.png

在7.2里HashTable

zend_refcounted_h gc 看起来唬人,实际就是个long,占用8字节

union... u 占用4字节

uint32_t 占用4字节

Bucket* 指针占用8字节

uint32_t nNumUsed 占用4字节

uint32_t nNumOfElements 占用4字节

uint32_t nTableSize 占用4字节

uint32_t nInternalPointer 占用4字节

zend_long nNextFreeElement 占用8字节

dtor_func_t pDestructor 占用8字节

总占用

字节数 = 8+4+4+8+4+4+4+4+8+8 = 56字节,并且正好达到了内存对齐的状态,没有额外的浪费。

另外还有PHP源代码里经常出镜的Buckets也从72下降到了32字节,这里我就不翻源代码了。

3 优化思想精髓

当当当,敲黑板,重点来了!我们看了两个核心数据结构的结构体变化,这上面的优化都是什么含义呢?拿HashTable举例,貌似从72字节优化到了56字节,这内存节约的也不是特别多嘛,才20%多而已!但这中间其实隐藏了两个较深层次优化思路:

第一、你是否记得我们前面CPU在向内存要数据的时候是以Cache Line为单位进行的,而我们说过Cache Line的大小就是64字节。回过头来看HashTable,在7.2里的56字节,只需要CPU向内存进行一次Cache Line大小的burst IO,就够了。而在5.3里的72字节,虽然只比Cache Line大了那么一丢丢,但是对不起,必须得进行两次burst IO才可以。所以,在计算机里,56字节相对72字节实际上是翻倍的性能提升!!

第二、CPU的L1、L2、L3的容量是固定的几十K或者几十M。假设Cache的都是HashTable,那么Cache容量不变的条件下,能Cache住的HashTable将会翻倍,缓存命中率提升一大截。要知道L1命中后只需要1ns多一点的耗时,而如果穿透到内存的话可能就需要40多纳秒的延时了,整整差了几十倍。

所以PHP内核的作者大牛深谙CPU与内存的工作原理,表面上看起来只是几个字节的节约,但是实际上爆发出了巨大的性能提升!!



审核编辑:刘清

声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉
  • cpu
    cpu
    +关注

    关注

    68

    文章

    10871

    浏览量

    211956
  • 内存
    +关注

    关注

    8

    文章

    3028

    浏览量

    74091
  • 操作系统
    +关注

    关注

    37

    文章

    6836

    浏览量

    123363
  • PHP
    PHP
    +关注

    关注

    0

    文章

    453

    浏览量

    26705
收藏 人收藏

    评论

    相关推荐

    FPGA通过SPI对DAC进行了配置,用频谱仪测不到输出是怎么回事?

    FPGA通过SPI对DAC进行了配置,确定配置时序正确,写了组测试的单音数据,data,clk,frame发的都对,用频谱仪测不到输出,可能是哪些地方不对呢?求助大神
    发表于 12-09 06:35

    内存蓝屏死机?内存验货指南值得拥有

    在内存领域,稳定性无疑是用户最需要关注的指标。由于身负整机数据交换的重任,因此其品质极大程度上决定着使用过程中,是否会出现蓝屏、死机等问题。本期我们将以墨云藏境系列DDR5 RGB国风内存为例,为
    的头像 发表于 12-02 15:38 133次阅读
    新<b class='flag-5'>内存</b>蓝屏死机?<b class='flag-5'>内存</b>验货指南<b class='flag-5'>你</b>值得拥有

    如何优化RAM内存使用

    :使用任务管理器查看当前运行的程序和服务,关闭那些不需要的。 禁用启动程序 :减少开机启动项,只保留必要的程序。 2. 优化操作系统设置 调整虚拟内存 :合理设置虚拟内存,避免过多占用硬盘空间。 清理磁盘 :定期
    的头像 发表于 11-11 09:58 379次阅读

    这些电源常用仿真软件,知道吗?

    谐振变换器电路进行了仿真建模,感兴趣的工程师们可以去回顾一下,这里就不赘述了。 常用仿真软件 在进行电源设备设计仿真时,会涉及到电路、电磁、热学、力学方面的仿真。 电路仿真: 通过仿真软件将电路的元件
    发表于 10-25 14:20

    TLV320AIC3106IRGZT随着PGA音量的抬高是不是同时将底噪也进行了放大?

    我的问题如下 1. 随着PGA音量的抬高是不是同时将底噪也进行了放大? 2. 这样的放大是不是芯片固有的现象?能否进一步降低频谱底噪?
    发表于 10-24 06:15

    石墨烯基导电油墨具有良好的渗透性和低阻抗,针对 RFID天线性能进行了

    “电子丝网印刷技术”是指电子信息技术与具有历史的丝网印刷技术相结合而产生的崭新技术。Haydale这款石墨烯墨水除了优异的柔韧性、附着力和兼容性外,用于 RFID 产品还能够传输和接收特定的无线电频率,具有好的渗透性和低阻抗,针对 RFID天线性能进行了优化
    的头像 发表于 09-13 15:26 408次阅读
    石墨烯基导电油墨具有良好的渗透性和低阻抗,针对 RFID天线性能<b class='flag-5'>进行了</b>优

    mesh的内存占用能否优化

    余110kb可用。 请问,mesh的内存占用问题能否优化?为何系统剩余大概60K0内存以下的时候系统会因内存不足重启?
    发表于 06-28 15:32

    ESP32S3的EEPROM是由FLASH虚拟的,直接在arduinoIDE中擦写EEPROM时是否在底层自动进行了磨损平衡?

    ESP32S3的EEPROM是由FLASH虚拟的,请问直接在arduinoIDE中擦写EEPROM时是否在底层自动进行了磨损平衡? 在用ESP32S3做含有计数器功能的设备,希望可以掉电保存数据
    发表于 06-07 06:27

    是否真的了解结构体占用了多少字节?

    结构体成员所占内存空间大小一般情况下,如果想知道结构体成员的内存占用情况需要:1、先用结构体在内存中开空间2、使用sizeof(结构体变量.成员名)或者sizeof(结构体指针->成员
    的头像 发表于 06-04 08:04 487次阅读
    <b class='flag-5'>你</b><b class='flag-5'>是否</b>真的了解结构体占用了多少字节?

    云服务器apache如何配置解析php文件?

    在云服务器上配置Apache以解析PHP文件通常需要以下步骤: 1、安装PHP:首先确保在服务器上安装了PHP可以使用包管理工具(如apt、yum等)来安装
    的头像 发表于 04-22 17:27 1026次阅读

    针对功率密度和低EMI进行了优化的LM62460、LM61480和LM61495引脚兼容6A/8A/10A降压转换器数据表

    电子发烧友网站提供《针对功率密度和低EMI进行了优化的LM62460、LM61480和LM61495引脚兼容6A/8A/10A降压转换器数据表.pdf》资料免费下载
    发表于 04-11 09:55 0次下载
    针对功率密度和低EMI<b class='flag-5'>进行了</b><b class='flag-5'>优化</b>的LM62460、LM61480和LM61495引脚兼容6A/8A/10A降压转换器数据表

    什么是HBM3E内存?Rambus HBM3E/3内存控制器内核

    Rambus HBM3E/3 内存控制器内核针对高带宽和低延迟进行了优化,以紧凑的外形和高能效的封装为人工智能训练提供了最大的性能和灵活性。
    发表于 03-20 14:12 2569次阅读
    什么是HBM3E<b class='flag-5'>内存</b>?Rambus HBM3E/3<b class='flag-5'>内存</b>控制器内核

    使用STM32H7的AD进行了7M频率的采集信号,采集进去后可以实现实时处理吗?

    使用STM32H7的AD进行了7M频率的采集信号,采集进去后可以实现实时处理吗?
    发表于 03-08 08:10

    数组和链表在内存中的区别 数组和链表的优缺点

    数组和链表在内存中的区别 数组和链表的优缺点  数组和链表是常见的数据结构,用于组织和存储数据。它们在内存中的存储方式以及优缺点方面存在一些显著的差异。本文将详细探讨这些差异以及它们的优缺点。 1.
    的头像 发表于 02-21 11:30 1054次阅读

    软件测试的7大原则,漏了几条?

    of error-fallacy) 99%无错误的软件仍然可能无法使用,如果针对缺陷要求对系统进行了全面测试,则可能是这种情况。软件测试不仅仅是为了发现缺陷,而且还要检查软件是否满足业务需求。没有错误是谬论,即如
    发表于 01-18 09:39