变量类型
PHP7版本函数的参数和返回值增加了类型限定。
原因:为了PHP7.1版本JIT特性做准备,增加类型之后PHP, JIT可以准确判断变量类型,生成最佳的机器指令。
function test (int $a, string $b, array $c) :int {
// code
}
错误异常
PHP程序出错后,过去Zend引擎会发生致命错误并终止程序运行,PHP7可以使用try/catch
捕获错误。
try {
no_func();
} catch (EngineException $e) {
echo "Exception: {$e->getMessage()}\n";
}
性能优化
zval使用栈内存
在Zend引擎和扩展中,经常要创建一个PHP变量,底层就是一个zval
指针。之前的PHP版本都是通过MAKE_STD_ZVAL
动态的从堆上分配一个zval
内存。而PHP7可以直接使用栈内存.
PHP5
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_ulog h;
size_t len;
char val[1]
}
优化数组的键值查找的性能。
hashtable桶内直接存数据,减少了内存申请次数,提升了Cache命中率和内存访问速度
zend_parse_parameters改为宏实现,性能提升5%
新增加4中OPCODE,call_user_funciton
,is_int/string/array
,strlen
,defeind
4个函数变为 PHP OpCode指令
其它性能优化,基础类型int,float,bool等改为直接进行值拷贝,排序算法改进
,PCRE with JIT
,execute_data
和opline使用全局寄存器
,使用gdb4.8的PGO功能
PHP7与JIT
PHP7.0-final版本没有携带JIT特性
JIT是just in time 的缩写,表示运行时将指令转为二进制机器码。
对于计算密集型的程序,JIT可以将PHP的OpCode直接转换为机器码,大幅提升性能。
**粗体** _斜体_ [链接](http://example.com) `代码` - 列表 > 引用
。你还可以使用@
来通知其他用户。