变量类型
函数的参数和返回增加了类型限定,增加类型后,PHP JIT可以准确判断变量类型,生成最佳的机器指令。
1 | function test(int $a, string $b, array $c) : int { |
错误异常
PHP程序出错后,之前版本Zend引擎会发生致命错误并终止程序运行,PHP7可以使用try/catch捕获错误。
1 | try { |
PHP7性能优化
- zval使用栈内存
在Zend引擎和扩展中,经常要创建一个PHP的变量,底层就是一个zval指针。之前的版本都是通过MAKE_STD_ZVAL动态的从堆上分配一个zval内存。而PHP7可以直接使用栈内存
- zend_string存储hash值,array查询不再需要重复计算hash
PHP7为字符串单独创建了新类型叫做zend_string,除了char * 指针和长度之外,增加了一个hash字段,用于保存字符串的hash值。数组键值不需要反复计算hash值。
hashtable 桶内直接存数据,减少了内存申请次数,提升了Cache命中率和内存访问速度。 arBucket改成了arData,arData直接就是一个大块内存,bucket是连续的。
zend_parse_parameters改为宏实现,性能提升5%。
新增加4种OPCODE,call_user_function,is_int/string/array,strlen,defined4个函数变为PHP opcode指令,速度更快。
其他优化,如基础类型int、float、bool等改为直接进行值拷贝,排序算法改进(zend_sort)。PCRE with JIT(正则表达式转成机器码)。使用gdb4.8的PGO功能。