首頁 > 後端開發 > PHP問題 > php7做了哪些優化

php7做了哪些優化

(*-*)浩
發布: 2023-02-26 07:50:01
原創
3182 人瀏覽過

php7做了哪些優化

一  zval使用堆疊記憶體

#在Zend引擎和擴充中,常常要建立一個PHP的變量,而底層就是一個zval指標。之前的版本都是透過MAKE_STD_ZVAL動態的從堆上分配一個zval記憶體。 (建議學習:PHP影片教學

而PHP7可以直接使用堆疊記憶體。 PHP程式碼中建立的變數也進行了最佳化,PHP7直接在堆疊記憶體上預先分配zval。這樣節約了大量記憶體分配和記憶體管理的操作。

二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計算操作,PHP的hashtable與C數組的性能一致。

三hashtable桶內直接儲存資料

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

四 zend_parse_parameters改為巨集實作

PHP的C擴充函數與PHP中的變數進行參數輸入時,要使用zend_parse_parameters()函數,這個函數根據一個字串參數找到對應PHP的zval指針,然後進行賦值。這個函數實際上有一定的效能消耗。

PHP7直接使用巨集取代了zend_parse_parameters函數,C擴充中不再需要使用zend_parse_parameters進行逐個參數的查找,巨集展開後自動會實作參數賦值。光是這一點就提升了5%的效能。

五 新增加4種OPCODE

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

六 其他更多最佳化

除了上面5個主要最佳化點之外,PHP7還有其他更多的細節效能最佳化。

以上是php7做了哪些優化的詳細內容。更多資訊請關注PHP中文網其他相關文章!

相關標籤:
php
來源:php.cn
本網站聲明
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn
作者最新文章
熱門教學
更多>
最新下載
更多>
網站特效
網站源碼
網站素材
前端模板