P
P
PHP 7 详解
Search…
⌃K

补充*PHP7底层性能优化

目录:

  • zval使用栈内存
  • zend_string存储hash值,array查询不在需要重复计算hash
  • zend_parse_parameters改为宏实现,性能提升5%
  • 新增加了4种OPCODE, call_user_function,is_int/string/array,strlen,defined 4个函数变为PHP OpCode指令,速度更快
  • 其他更多性能优化:
  • 其他:PHP7.0-final版本不会携带JIT特征

zval使用栈内存

在Zend引擎和扩展中,经常要创建一个PHP变量,底层就是一个zval指针。之前的版本都是通过MAKE_STD_ZVAL动态从堆上分配一个zval内存。而PHP7可以直接使用栈内存。
32字节-》16字节
这样做的好处:大量节省了内存分配和内存管理的工作,性能就会得到很大的提升。

PHP 5

zval *val; MAKE_STD_ZVAL(val);

PHP7

zval val;

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

PHP7为字符串单独创建了新类型叫zend_string,除了char *指针和长度之外,增加了一个hash字段,用于保存字符串的hash值。数组键值查找不需要反复计算hash值。
struct _zend_string {
zend_refcounted gc;
zend_ulong h;
size_t len;
char val[1]
};
为了优化数组的键值查找性能,h即为存储hash值的字段。
hashtable桶内直接存数据,减少了内存申请次数,提升了Cache命中率和内存访问速度
PHP 7 新的hashtable实现
老:之前的php底层HashTable的实现:http://www.cnblogs.com/mingaixin/p/4318805.html

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

zend_parse_parameters:是从php变量到C扩展函数之间交换一些参数,还有交换返回值,这时候要用zend_parse_parameters函数来实现。

新增加了4种OPCODE, call_user_function,is_int/string/array,strlen,defined 4个函数变为PHP OpCode指令,速度更快

其他更多性能优化:

如基础类型为int,float,bool等改为直接进行值拷贝;排序算法改进,PCRE with JIT(正则表达式直接编译成机器码), execute_data和opline使用全局寄存器,使用gdb4.8的PGO功能(运行一段时间,它会导出一份运行时的数据统计)

其他:PHP7.0-final版本不会携带JIT特征

请参考视频资料: PHP7 与 JIT
JIT是just in time的缩写,表示运行时将指令转为二进制机器码。
为什么PHP7中没有引入JIT ? 原因:JIT对于实际项目,如WordPress没有太大的性能提升。
但是:对于计算密集型程序,JIT可以将PHP的OpCode直接转换为机器码,大幅提升性能。 PHP开发组已重启JIT开发计划,我看了一下官方,截止到PHP7.1版本没有带有JIT特征。