php7 变量,PHP7变量结构分析

PHP7相对于PHP5提升了将近一倍的性能,下面我将针对PHP7与PHP5的变量结构实现进行对比,分析为什么PHP7性能提升。当然变量结构修改只是PHP7性能提升中的一部分原因,还有很多原因比如HashTable结构变更、减少内存分配次数、多使用栈内存等等,本文只对变量结构进行分析。

本文源码基于PHP7.2.3以及PHP5.6.34

PHP作为弱类型语言,所有变量都是zval结构体来保存,PHP7与PHP5的zval结构也不相同,下面将分析两者zval结构的不同之处。

PHP5

PHP5的zval定义于Zend\zend.h

typedef struct _zval_struct zval; //此段代码在Zend\zend_types.h中

...

typedef union _zvalue_value {

long lval;/* long value */

double dval;/* double value */

struct {

char *val;

int len;

} str;

HashTable *ht; /* hash table value */

zend_object_value obj;

zend_ast *ast;

} zvalue_value;

struct _zval_struct {

/* Variable information */

zvalue_value value; /* value */

zend_uint refcount__gc;

zend_uchar type; /* active type */

zend_uchar is_ref__gc;

};

可以看到zval结构体有四个成员:

zvalue_value:共用体,储存变量的值

refcount__gc:引用计数,用于垃圾回收,默认值1

type:变量的具体类型

is_ref__gc:是否引用,用于垃圾回收,默认值0

zvalue_value共用体用来储存变量的值:

long lval成员用于储存整型与布尔型。

double dval成员用于储存 浮点型。

结构体str用于存储字符串,之所以使用结构体是用来储存字符串的长度,实时获取字符串的长度的时间复杂度是O(n),在PHP中字符串的操作非常频繁,这样能节省大量的时间。

HashTable *ht用来存储数组,PHP中的数组非常强大,这一切都基于哈希表结构。

zend_object_value obj用来存储对象。在面向对象编程中,这也是非常重要的一部分。

zend_ast *ast zend抽象语法树,zend内核使用。

zval结构体中的type成员有以下几种类型(代码位于Zend\zend.h):

/* data types */

/* All data types <= IS_BOOL have their constructor/destructors skipped */

#define IS_NULL 0 #define IS_LONG 1 #define IS_DOUBLE 2 #define IS_BOOL 3 #define IS_ARRAY 4 #define IS_OBJECT 5 #define IS_STRING 6 #define IS_RESOURCE 7 #define IS_CONSTANT 8 #define IS_CONSTANT_AST 9 #define IS_CALLABLE 10

PHP7

PHP7的zval定义于Zend\zend_types.h

typedef struct _zval_struct zval;

...

typedef union _zend_value {

zend_long lval;/* long value */

double dval;/* double value */

zend_refcounted *counted;

zend_string *str;

zend_array *arr;

zend_object *obj;

zend_resource *res;

zend_reference *ref;

zend_ast_ref *ast;

zval *zv;

void *ptr;

zend_class_entry *ce;

zend_function *func;

struct {

uint32_t w1;

uint32_t w2;

} ww;

} zend_value;

struct _zval_struct {

zend_value value;/* value */

union {

struct {

ZEND_ENDIAN_LOHI_4(

zend_uchar type,/* active type */

zend_uchar type_flags,

zend_uchar const_flags,

zend_uchar reserved) /* call info for EX(This) */

} v;

uint32_t type_info;

} u1;

union {

uint32_t next; /* hash collision chain */

uint32_t cache_slot; /* literal cache slot */

uint32_t lineno; /* line number (for ast nodes) */

uint32_t num_args; /* arguments number for EX(This) */

uint32_t fe_pos; /* foreach position */

uint32_t fe_iter_idx; /* foreach iterator index */

uint32_t access_flags; /* class constant access flags */

uint32_t property_guard; /* single property guard */

uint32_t extra; /* not further specified */

} u2;

};

可以看到PHP7的代码相对PHP5的代码更加符合规范,所以更便于理解。

在_zval_struct结构体中:

zend_value共用体用于储存变量的值

u1共用体,用于存储变量的类型,以及一些辅助值

u2共用体,辅助值,由于内存对齐,_zval_struct结构体总共16字节大小,zend_value为8字节,u1为4字节,剩下的4字节防止浪费,用来作为辅助值,具体辅助用来干嘛代码的注释已经说明了。

u2共用体的辅助值成员一直在增加,我记得当时PHP7刚发布的时候才4个辅助值,现在已经9个了。

zend_value共用体就不用解释了,相比PHP5,PHP7的代码结构更加清晰、规范,一眼就能看出共用体的成员都用来储存什么类型的数据,我们可以发现PHP7 zend_value共用体大部分数据都是存储的指针,由于指针占的内存小,所以PHP7的zend_value占的内存比PHP5的zend_value要小。

对比

我们可以看到虽然PHP7的变量结构看起来更复杂,但是由于使用共用体,所以其实内存占用并不多,PHP5中的zval占用24个字节,PHP7中的zval占用16个字节。内存占用减少了1/3,而且PHP中的代码逻辑都是基于变量来实现的,所以对性能的影响非常大。可以看到PHP7中的代码规范比PHP5好了很多,并且PHP7的变量结构中辅助值的使用充分利用了内存,同时提高了性能。

结语

PHP7主要是优化性能,其实这个和互联网的发展也有关系。在之前,访问量和性能并不是最主要的,PHP凭借敏捷开发能在编程语言中占据一席之地。然而随着互联网的发展,网民数量的增多,以及各种编程语言的出现,大多数大型网站追求的是高并发以及访问速度,这个时候PHP的劣势就展示出来了。当然可以感受到PHP社区对这门语言的热情,包括PHP7的性能提升,swoole扩展的流行,以及正在开发中的PHP JIT版本,相信PHP会发展的越来越好。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/500864.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

点在不规则图形内算法python_目标检测算法中规则矩形和不规则四边形IOU的Python实现...

交并比(Intersection-over-Union&#xff0c;IoU)&#xff0c;目标检测中使用的一个概念&#xff0c;我们在进行目标检测算法测试时&#xff0c;重要的指标&#xff0c;是产生的预测框(candidate bound)与标记框(ground truth bound)的交叠率&#xff0c;即它们的交集与并集的比…

树莓派跑php,在树莓派4上部署nginx+php

本试验是基于树莓派的 buster 版本。一、安装 nginxapt install nginx -y完成安装之后&#xff0c;可以使用 dpkg -l | grep nginx 找到相关的安装包&#xff1a;通过分析 /var/lib/dpkg/status 可以得到 nginx 安装包的依赖关系&#xff1a;nginx --> nginx-full --> li…

只有python可以爬虫吗_无所不能的Python之爬虫那点事儿

今天给大家介绍一个有趣的新技术——爬虫。首先来讲一下啥是爬虫。爬虫也叫网络爬虫&#xff0c;是一种按照一定的规则&#xff0c;自动地抓取万维网信息的程序或者脚本。通俗的来讲&#xff0c;爬虫就是一段程序&#xff0c;它来根据你的设定自己去互联网上浏览网页并把这些信…

java排队系统模型,MMC排队系统模型

MMC排队系统模型及应用M/M/C排队模型及其应用摘要&#xff1a;将随机服务系统中M/M/C排队模型应用到理发服务行业中。通过对某理发店进行调查&#xff0c;以10min为一个调查单位调查顾客到达数&#xff0c;统计了72个调查单位的数据&#xff0c;又随机调查了113名顾客服务时间&…

php 如何生成微信小程序,微信小程序一键生成平台系统/一键生成小程序开源小程序PHP|ThinkPHP平台源码下载...

源码名称&#xff1a;微信小程序一键生成平台系统/一键生成小程序开源小程序PHP|ThinkPHP平台源码下载购买须知&#xff1a;(请仔细阅读了解)【1】源码一律经测试无误。【2】不提供任何修改和编辑服务&#xff0c;不包安装调试&#xff0c;假如你什么都不懂的请不要拍。【3】假…

python excel格式刷_Excel格式刷怎么用?没你想的那么简单,你知道几种用法?

【温馨提示】亲爱的朋友&#xff0c;阅读之前请您点击【关注】&#xff0c;您的支持将是我最大的动力&#xff01;Excel使用过程中&#xff0c;格式刷相信小伙伴们都知道&#xff0c;平常也没少用。Excel中格式刷可以帮助我们快速的复制单元格的格式&#xff0c;而不用再重新设…

php接受post接受不到数据,PHP $_POST接受不到数据,但$_GET可以接受数据

"HTML ajax端 $.ajax({ url:/login.php, data:{name:name, pwd:pwd}, type:POST, dataType:json, success:function(data){ console.dir(data) if(data.status 1) alert(data.mes) }else{ alert(data.mes) } } })php端&#xff1a;$sql "SELECT * FROM user WHERE …

python安装多个版本_Mac安装多个python版本

Mac安装多个python版本步骤如下&#xff1a;1、安装pyenv$sudo brew install pyenv然后在 .bash_profile 文件中添加命令&#xff1a;vi .bash_profile添加&#xff1a;eval "$(pyenv init -)"最后&#xff0c;更新一下环境变量命令&#xff1a;source .bash_profile…

java .item,javabb-javaitem-cloud

JavaItem-Cloud项目介绍JavaItem-Cloud是一个新开发的微服务架构平台&#xff0c;基于最新流行的技术SpringBoot、SpringCloud & SpringCloud Alibaba、Vue、Vuex、ElementUI。系统特性后端使用当前流行技术&#xff0c;SpringBoot、SpringCloud、SpringCloud Alibaba、Myb…

软件使用手册模板_我的印象笔记使用手册(精简说明)

在之前的一文中&#xff0c;我已经详细写过我的印象笔记使用的方法了&#xff0c;这次呢&#xff0c;再做一个更新的使用情况和更清楚明了和精简的说明。不居竹&#xff1a;我的印象笔记使用手册​zhuanlan.zhihu.com文章目录&#xff1a;1、知识管理收集知识整理知识输出知识2…

java 响应事件,用java响应颜色事件

我正在构建一个java应用程序来解决难题 . 我编码的方式基本上是程序将采取屏幕截图&#xff0c;在屏幕截图中找到一个像素&#xff0c;并通过机器人功能将鼠标移动到桌面上的那个位置 . 我理解屏幕截图背后的理论&#xff0c;将其存储在一个数组中&#xff0c;探索数组直到一个…

怎样保存python源程序_五分钟教会你如何编写、保存与运行 Python 程序

第一步接下来我们将看见如何在 Python 中运行一个传统的“Hello World”程序。Python教程本章将会教你如何编写、保存与运行 Python 程序。通过 Python 来运行的你的程序有两种方法——使用交互式解释器提示符或直接运行一个源代码文件。我们将了解如何使用他们二者的功能。使用…

matlab实验8数据分析与多项式计算,hashidamatlab实验八数据处理与多项式计算.doc

实验八电子二班张秀云 一、实验目的〔据处理与多项式计算1、掌握数据统计和分析的方法2、掌握数值插值与曲线拟合的方法及其应用3、掌握多项式的常用运算二、实验内容1、利用MATLAB提供的rand函数生成30000个符合均匀分布的随机 数&#xff0c;然后检验随机数的性质&#xff1a…

微信群定时发消息 python_Python实现每天定时发微信问候语

IT学习乐园甄选优质技术文档&#xff0c;服务群众&#xff01;作者&#xff1a;varlemon来源&#xff1a;https://www.cnblogs.com/connect/p/python-wechat-iciba.html图源&#xff1a;网络编辑&#xff1a;IT技术头条免责声明&#xff1a;1.本公众号所转载文章均来自公开网络…

php页面添加链接,怎么给一个PHP密码访问页面加超链接

该楼层疑似违规已被系统折叠 隐藏此楼查看此楼$password "1234"; // 这里是密码$p "";if(isset($_COOKIE["isview"]) and $_COOKIE["isview"] $password){$isview true;}else{if(isset($_POST["pwd"])){if($_POST["…

python 硬件模拟_如何编写一个硬件模拟器?

当下是短视频的时代&#xff0c;随着5g进程的加速推动&#xff0c;短视频已经成为了很多自媒体人变现的主要途径B站&#xff0c;抖音&#xff0c;快手&#xff0c;西瓜视频等等各大平台都砸钱鼓励平台创作者创作视频&#xff0c;因为平台流量大&#xff0c;我们就可以通过一些技…

通信之道从微积分到5gpdf_保送清华成博士,华为12年搞通信,他为何如此看待 5G ?| 人物志...

作者 | 伍杏玲 胡巍巍出品 | CSDN(ID&#xff1a;CSDNnews)一位通信专家&#xff0c;清华读了博士&#xff0c;北大从事博士后研究工作&#xff0c;但却只有12年工作经历&#xff1f;明明家里几套房&#xff0c;却热爱骑车出行&#xff1f;他是&#xff1f;他是国内小有名气的通…

manifest php,Laravel PackageManifest.php: Undefined index: name

问题Im just trying to deploy my application and I just ran composer update on my server and I got the following error:In PackageManifest.php line 122:Undefined index: nameHow can I fix this issue?回答1:i had the same problem.In my case downgrading the com…

python使用spark-sql读取数据并可视化_使用Spark SQL读取HBase上的数据

近日&#xff0c;由华为团队开发的1、基于部分评估技术&#xff0c;该项目具有强大的数据剪枝和智能扫描特点&#xff1b;2、支持自定义过滤规则、协处理器等以便支持超低延迟的处理&#xff1b;3、支持SQL、DataFrame&#xff1b;4、支持更多的SQL(比如二级索引、布隆过滤、主…

mysql封装 javabean,利用Java针对MySql封装的jdbc框架类JdbcUtils完整实现(包含增删改查、JavaBean反射原理,附源码)...

最近看老罗的视频&#xff0c;跟着完成了利用Java操作MySql数据库的一个框架类JdbcUtils.java,完成对数据库的增删改查。其中查询这块&#xff0c;包括普通的查询和利用反射完成的查询&#xff0c;主要包括以下几个函数接口:1、public Connection getConnection() 获得数据库的…