PHP7版本函數的參數和返回值增長了類型限定。
緣由:爲了PHP7.1版本JIT特性作準備,增長類型以後PHP, JIT能夠準確判斷變量類型,生成最佳的機器指令。php
function test (int $a, string $b, array $c) :int { // code }
PHP程序出錯後,過去Zend引擎會發生致命錯誤並終止程序運行,PHP7能夠使用try/catch
捕獲錯誤。html
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;
做用:節省一次內存分配和管理.php7
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直接轉換爲機器碼,大幅提高性能。指針