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

    文章

    11223

    浏览量

    223016
  • 内存
    +关注

    关注

    9

    文章

    3173

    浏览量

    76123
  • 操作系统
    +关注

    关注

    37

    文章

    7331

    浏览量

    128672
  • PHP
    PHP
    +关注

    关注

    0

    文章

    460

    浏览量

    28398
收藏 人收藏
加入交流群
微信小助手二维码

扫码添加小助手

加入工程师交流群

    评论

    相关推荐
    热点推荐

    新思科技助力UCIe 3.0快速落地

    芯片已从单一整体式芯片发展为集成多个芯粒的 Multi-Die 设计,其中每个芯粒针对处理、内存和数据传输等特定功能进行了优化
    的头像 发表于 11-30 10:01 412次阅读

    请问Keil的优化等级到底该如何选择?

    做任何优化。代码的执行顺序与源代码完全一致,变量始终存储在内存中(不进行寄存器优化),函数调用栈帧清晰。 -O1 (有限优化 / Opti
    发表于 11-20 07:51

    通过优化代码来提高MCU运行效率

    内存访问优化 充分利用缓存:如果MCU有Cache,尽量保证代码和数据的局部性,即让相关的数据在内存中连续存放。 避免内存碎片:在动态内存
    发表于 11-12 08:21

    知道板卡厂商参与芯片研发的α阶段意味着什么?

    大家知道芯片很重要,但是否知道一颗芯片从设计构思到最终量产,需要经历怎样一个漫长的过程吗?
    的头像 发表于 09-24 17:08 7283次阅读
    <b class='flag-5'>你</b><b class='flag-5'>知道</b>板卡厂商参与芯片研发的α阶段意味着什么?

    SOLIDWORKS2025在性能和响应速度方面进行了大幅提升

    在工程设计领域,软件的性能和响应速度是衡量其效率与用户体验的重要指标。SOLIDWORKS作为CAD软件之一,始终致力于为用户提供更有效、更稳定的设计平台。随着solidworks2025版本的发布,其在性能和响应速度方面实现了显著提升,为全球设计师和工程师们带来了流畅设计体验。
    的头像 发表于 08-06 10:25 765次阅读

    TPS62684 1600mA 高效降压转换器,针对小尺寸解决方案进行了优化数据手册

    进行了优化, 支持高达 1600mA 的负载电流,并允许使用低成本的片式电感器和电容器。 该器件的输入电压范围为 3.25V 至 5.5V,支持由锂离子供电的应用 电池以及 5V 导轨。
    的头像 发表于 06-25 13:41 489次阅读
    TPS62684 1600mA 高效降压转换器,针对小尺寸解决方案<b class='flag-5'>进行了</b><b class='flag-5'>优化</b>数据手册

    鸿蒙5开发宝藏案例分享---内存优化实战指南

    就是的 App变卡、变慢、甚至直接闪退 !想象一下手机后台在疯狂“打扫卫生”,的应用能不卡吗? 优化内存的好处: 应用更流畅(丝滑!)、响应更快、系统资源占用少、设备续航更久(用户
    发表于 06-12 17:15

    HarmonyOS优化应用内存占用问题性能优化

    一、使用purgeable优化C++内存 Purgeable Memory是HarmonyOS中native层常用的内存管理机制,可用于图像处理的Bitmap、流媒体应用的一次性数据、图片等
    发表于 05-24 17:20

    HarmonyOS优化应用内存占用问题性能优化

    一、 概述 用户功能的不断增强,应用越来越复杂,占用的内存也在不断膨胀,而内存作为系统的稀缺资源比较有限,当应用程序占用过多内存时,系统可能会频繁进行内存回收和重新分配,导致应用程序的
    发表于 05-21 11:27

    SOLIDWORKS 2025在电气设计与仿真方面进行了优化

    随着科技的飞速发展,工程设计领域对电气设计与仿真工具的要求日益提高。SOLIDWORKS作为三维CAD设计和仿真分析软件,始终致力于通过技术创新推动行业发展。2025年推出的SOLIDWORKS 2025版本,在电气设计与仿真方面实现了诸多突破和优化,为用户提供了更加有效
    的头像 发表于 04-25 10:46 665次阅读
    SOLIDWORKS 2025在电气设计与仿真<b class='flag-5'>方面</b><b class='flag-5'>进行了</b><b class='flag-5'>优化</b>

    iMX8MPlus SoC M7核心是否需要单独的RAM内存

    对于 iMX8MPlus SoC ,M7 核心是否需要单独的 RAM 内存?或者是否有用于 M7内核的内部 SRAM?
    发表于 03-28 08:03

    HarmonyOS NEXT 原生应用/元服务-DevEco Profiler性能优化过程

    流程概览 在开发应用时,开发者会对应用的运行情况有一个预期的指标,当应用在某些方面不能满足预期的指标或者表现不佳时,意味着您的应用可能存在性能问题,需要对应用进行性能优化以达到您的预期。应用的性能
    发表于 02-19 15:28

    使用ADS1198-FE下载了软件按照说明进行了调试,出现了两个问题求解决

    使用ADS1198-FE,下载了软件按照说明进行了调试,但出现了两个问题: 1、工频干扰特别大,淹没了有用信号。后来我直接将通道2与信号发生器相接看波形,依旧有非常大的干扰,几乎看不到波形。 2
    发表于 02-07 08:24

    hyper 内存,Hyper内存:如何监控与优化hyper-v虚拟机的内存使用

    :如何监控与优化hyper-v虚拟机的内存使用。    在虚拟化环境中,合理监控和优化Hyper-V虚拟机的内存使用对于提升性能和资源利用率至关重要。本文将详细介绍如何监控Hyper-
    的头像 发表于 01-24 14:15 1692次阅读
    hyper <b class='flag-5'>内存</b>,Hyper<b class='flag-5'>内存</b>:如何监控与<b class='flag-5'>优化</b>hyper-v虚拟机的<b class='flag-5'>内存</b>使用

    高压SiC针对电动汽车长途卡车运输中的兆瓦级充电进行了优化

    电子发烧友网站提供《高压SiC针对电动汽车长途卡车运输中的兆瓦级充电进行了优化.pdf》资料免费下载
    发表于 01-22 15:38 0次下载
    高压SiC针对电动汽车长途卡车运输中的兆瓦级充电<b class='flag-5'>进行了</b><b class='flag-5'>优化</b>