目前一直使用php7也看了许多文档视频等,整理一下相关细节(仅为记录~),对于PHP7性能,如下图所示。

* 在wordpress3.0.1中 php7比php5.6性能提升约3倍左右

新特性

一.变量类型

php7版本函数参数和返回值增加了类型的限定,设定类型变量主要对密集计算增加了性能。

function test(int $a,string $b,array $c) : int {
//code
}

二.错误异常

php版本<7 程序出错后程序会抛出致命错误并且终止程序异常,php7可以使用try..catch捕获错误。

try {
//error code
}catch(EngineException $e){
echo $e->getMessage();
}

三.性能优化

1.zval使用了栈内存

在zend引擎中,经常要创建一个变量,底层就是一个zval指针。之前的版本都是从MAKE_STD_ZVAL动态的从堆上分配一个zval的内存,php7可以直接使用栈内存。

php5
zval *val;
MAKE_STD_ZVAL(val); php7
zval val;

这样做节省了大量的内存分配和内存管理等操作,从而性能得到很大的提升。

2.zend_string 存储hash值,array查询不需要重复计算hash

php7中为字符串单独的创建了新类型叫做zend_string,除了char*指针和长度外,还增加了一个hash值,进而对于数组查找不需要反复计算hash值。在php7版本以前zend引擎会有大量的时间用于计算hash值,对于实际php程序运行起来之后,大部分key是保持不变的,对于php7引擎存储了hash值,避免大量的hash计算。

strut _zend_string{
zend_refcounted gc;
zend_ulong h;//存储hash值
site_t len;
char val[1]
}

这样做主要优化了数组的键值查找,实际上在php底层很多地方用到了hash,例如类的属性,类方法函数等

3.hashtable桶内直接存数据,减少了内存申请次数,提升了cache命中率和内存的访问速度。

   => 

4.zend_parse_parameters 改为宏实现,性能提升5%

5.增加了4种opcode,call_user_function, is_int/string/array, strlen, defined 4个函数变为opcode指令,速度更快。

6.其他优化,例如,优化排序算法等。

待完善~

关于PHP7的更多相关文章

  1. TODO:macOS编译PHP7.1

    TODO:macOS编译PHP7.1 本文主要介绍在macOS上编译PHP7.1,有兴趣的朋友可以去尝试一下. 1.下载PHP7.1源码,建议到PHP官网下载纯净到源码包php-7.1.0.tar.g ...

  2. 搭建LNAMP环境(七)- PHP7源码安装Memcached和Memcache拓展

    上一篇:搭建LNAMP环境(六)- PHP7源码安装MongoDB和MongoDB拓展 一.安装Memcached 1.yum安装libevent事件触发管理器 yum -y install libe ...

  3. Centos7安装PHP7

    安装依赖 yum updateyum install gcc-c++ libxml2 libxml2-devel openssl openssl-devel bzip2 bzip2-devel lib ...

  4. Ubuntu 16.04 LAMP server 指南 - 配置 Apache2.4,PHP7,和MariaDB(而不是MySQL)

    翻译自:https://www.howtoforge.com/tutorial/install-apache-with-php-and-mysql-on-ubuntu-16-04-lamp/ 昨天在虚 ...

  5. CentOS 7.1编译安装PHP7

    原文: https://typecodes.com/web/centos7compilephp7.html?utm_source=tuicool&utm_medium=referral 1 创 ...

  6. 编译安装PHP7并安装Redis扩展Swoole扩展

    编译安装PHP7并安装Redis扩展Swoole扩展 在编译php7的机器上已经有编译安装过php5.3以上的版本,从而依赖库都有了 本php7是编译成fpm-php 使用的, 如果是apache那么 ...

  7. php7 安装redis扩展

    从pecl下载的phpredis扩展在make时报错,google了一下,解决办法,因为phpredis 有专门为php7的分支,所以先git clone phpredis下来 git clone h ...

  8. 解决升级PHP7后 微信公众号收不到消息

    服务器配置Linux+Nginx+PHP5.5+mysql index方法配置微信的关注回复.菜单事件.多客服.自动回复等 public function actionIndex() { if (is ...

  9. mysql_connect() php7不支持,php5.5可以,是废弃函数

    天用了PHP7,发现和PHP5变化还挺大的,最大的就是MySQL的连接库变了. PHP5中使用mysql_connect()函数进行连接,但实际上,PHP5.5开始,MySQL就不推荐使用了,属于废弃 ...

  10. centos 7.2 安装PHP7.1+apache2.4.23

    安装准备:   http://ftp.cuhk.edu.hk/pub/packages/apache.org//httpd/httpd-2.4.23.tar.gz 下载apache http://cn ...

随机推荐

  1. npm包管理器相关知识

    关于npm包安装命令的介绍,如下图:

  2. 自增ID算法snowflake(雪花)

    在数据库主键设计上,比较常见的方法是采用自增ID(1开始,每次加1)和生成GUID.生成GUID的方式虽然简单,但是由于采用的是无意义的字符串,推测会在数据量增大时造成访问过慢,在基础互联网的系统设计 ...

  3. C++学习-3

    引用与函数指针: 函数指针就是把函数名挖掉变成*p 函数指针的类型就是把p去掉 函数指针的引用(引用就是在类型和名字的中间加&) 函数指针加一个()就成调用函数了-----------p() ...

  4. 分享调用Java private方法

    上周在修复bug时,发现Java类中某方法是private,且类中没有用到,第一感觉是方法多余.其实通过分析,发现原来Native Code会通过JNI调到此方法.这也给自己启发,平时做Code re ...

  5. 【Java一看就懂】浅克隆和深克隆

    一.何为克隆 在Java的体系中,数据类型分为基本数据类型和引用数据类型. 基本数据类型包括byte,short,int,long,float,double,boolean,char 8种,其克隆可通 ...

  6. 走进webpack(3)-- 小结

    写这一系列的文章,本意是想要梳理一下自己凌乱的webpack知识,只是使用过vue-cli,修改过其中的一部分代码,但是对于一个简单项目从0开始搭建webpack的流程和其中的依赖并不是十分清楚.所以 ...

  7. python scrapy框架爬虫遇到301

    1.什么是状态码301 301 Moved Permanently(永久重定向) 被请求的资源已永久移动到新位置,并且将来任何对此资源的引用都应该使用本响应返回的若干个URI之一.如果可能,拥有链接编 ...

  8. C语言第二周作业----分支结构

    一.PTA实验作业 题目1.7-1计算分段函数 本题目要求计算下列分段函数f(x)的值: 注:可在头文件中包含math.h,并调用sqrt函数求平方根,调用pow函数求幂. 1.实验代码 int ma ...

  9. 20155306 2017-2018-1《信息安全系统设计》第二周课堂测试以及myod的实现

    20155306 2017-2018-1<信息安全系统设计>第二周课堂测试以及myod的实现 第二周课堂测验: (注:前两项在课堂已提交,在此不做详解) 第一项: 每个.c一个文件,每个. ...

  10. Java暑假作业

    一.电影观后感 电影<摔跤吧!爸爸>观后感 二.下学期的计划与目标 大一学年总结: 参与了大大小小的学院活动,例如机器人搭建.辩论赛,也参加了学生会的部门,参与了组织活动.通过参与活动获 ...