补充*PHP7底层性能优化
请参考视频资料:PHP7 底层性能优化(一) 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
PHP7
zend_string存储hash值,array查询不在需要重复计算hash
PHP7为字符串单独创建了新类型叫zend_string,除了char *指针和长度之外,增加了一个hash字段,用于保存字符串的hash值。数组键值查找不需要反复计算hash值。
为了优化数组的键值查找性能,h即为存储hash值的字段。
hashtable桶内直接存数据,减少了内存申请次数,提升了Cache命中率和内存访问速度
PHP 7 新的hashtable实现:
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特征。
Last updated