最近学习了PHP 7介绍的视频,看到了PHP每一天都在变好。PHP 将会带来许多新的特性:
- 抽象语法树,在编译opcode时能够做更多的优化
- INT64提升,支持大于2GB的字符串/文件上传
- 标量类型声明,可以声明参数类型
- 返回值声明,可以声明返回值类型
- 新操作符,<=>操作符,大于返回1,等于返回0,小于返回-1
- 统一变量语法;
- 引擎异常改进,函数不存在的fata error转为异常可以捕获处理
等等。
除了新特性外,PHP 7使用了新引擎PHP NG,性能得到了巨大的提升(与HHVM对比)。
这里的性能优化比较有意思, 非常值得借鉴学习。为什么要进行重构:
- PHP 5.4之后php引擎的性能提升已经不大,Zend VM已经高度优化
- PHP JIT(Just In Time Compiler)项目在benchmakr上性能提升巨大(8倍),但是在实际业务提升不大(离开实际业务谈benchmark都是耍流氓)
- 分析wordpress项目发现瓶颈并不在Zend VM上面,21% CPU时间花在了内存管理,12%时间花在了hashTable操作,30% CPU时间花在了内部调用,25% CUP时间花在了VM
首先应当分析实际业务的性能消耗占比,确定需要优化的地方。JIT仅仅优化了Zend VM,提升是有限的,需要对其他地方(内存操作,HashTable,函数调用)也进行优化,所以才进行的重构。
PHP NG在很多方面做了优化:
- 标量类型不做引用计数,zval分配在堆上,增加Referance类型
- 增加类型zend string,将字符串与值连续分配,避免CPU cache miss,避免二次读内存
- 原本的HashTable变为zend array,数组值为zval,内存一次分配,提升data locality,避免CPU cache miss
- 函数调用优化,减少重复入栈
- 参数解析优化,将不确定转化为确定
- zend_qsort排序优化
- 内存管理优化,减少CPU cache miss
- 常用函数优化
- 字符串拼接优化,减少内存访问次数
通过这一系列的优化,改进了PHP的内存操作,改进了HashTable操作,改进了内部函数调用,降低了CPU 时间消耗,这时候再来做PHP JIT优化就有意义。PHP 7接下来仍然会继续优化,迁移常用扩展。
许多优化都是微小的,但是积累起来后却是巨大,特别是对于微博这样的网站,1%的性能提升都意义非凡。
优化是具有专向性的,对A场景的优化可能并不适合B场景,所以需要分析实际的业务中的瓶颈和调用频次,权衡优化的方向。
现在距离10月份发布已经不远了,大家也可以检查自己项目是否兼容PHP 7,性能提升多少。
参考链接:
PHP7 – New engine for good old train
PHP7 VS HHVM (WordPress)
PHPNG (next generation)
What to Expect When You’re Expecting: PHP 7, Part 1
PHP 7 Feature Freeze
HHVM
HHVM 是如何提升 PHP 性能的?
PHP Fights HHVM and Zephir with PHPNG
rlerdorf/php7dev
Building and testing the upcoming PHP7
Install PHP 7 on Ubuntu 14.04