PHP7 做的相關優化

1、zval使用棧內存

在Zend引擎和擴展中,經常要創建一個PHP的變量,底層就是一個zval指針。之前的版本都是通過MAKE_STD_ZVAL動態的從堆上分配一個zval內存。而PHP7可以直接使用棧內存。PHP代碼中創建的變量也進行了優化,PHP7直接在棧內存上預分配zval。這樣節約了大量內存分配和內存管理的操作。

 

PHP5

zval *val; MAKE_STD_ZVAL(val);

 

PHP7

zval val;

 

2、zend_string存儲hash值,array查詢不再需要重複計算hash

PHP7爲字符串單獨創建了新類型叫做zend_string,除了char *指針和長度之外,增加了一個hash字段,用於保存字符串的hash值。PHP中array是核心數據結構,PHP程序中往往都有大量的$array[$key]操作,雖然hashtable查找的時間複雜度是O(1),但$key要轉爲hash值是要經過計算的。不僅僅是array操作,實際上PHP底層對於類屬性、類方法、函數,訪問時都要先通過hashtable查找到對應的指針,再執行對應的操作。PHP7之前Zend引擎會有大量的CPU時間用於計算hash值。

 

實際上PHP程序運行起來之後,大部分情況下$key的值都是不變的。PHP7乾脆將這個hash值保存起來,下次直接使用,這樣就節省了大量的hash計算操作

 

3、hashtable桶內直接存數據

PHP5的hashtable每個元素都是一個 Bucket *,而PHP7直接存Bucket,減少了內存申請次數,提升了Cache命中率和內存訪問速度。

 

4、zend_parse_parameters改爲宏實現

PHP的C擴展函數與PHP中的變量進行參數輸入時,要使用zend_parse_parameters()函數,這個函數根據一個字符串參數找到對應PHP的zval指針,然後進行賦值。 這個函數實際上有一定的性能消耗。PHP7直接使用宏替換了zend_parse_parameters函數,C擴展中不再需要使用zend_parse_parameters進行逐個參數的查找,宏展開後自動會實現參數賦值。僅此一項就提升了5%的性能。

 

5、新增加4種OPCODE

很多PHP程序中會大量使用call_user_function, is_int/string/array,  strlen , defined 函數。PHP5 都是以擴展函數的方式提供,PHP7中這4類函數改成ZendVM的OPCODE指令,執行更快。

 

6、其他更多優化

除了上面5個主要優化點之外,PHP7還有其他更多的細節性能優化。如基礎類型int、float、bool等改爲直接進行值拷貝,排序算法改進,PCRE with JIT,execute_data和opline使用全局寄存器等等。PHP7對性能的優化會繼續進行下去。

發佈了117 篇原創文章 · 獲贊 6 · 訪問量 1萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章