Zend引擎的優化

 

在PHP 5.4的更新list上, 有一句: 提升了Zend引擎的性能, 減少了內存佔用.

那麼, 到底是怎麼提升的呢?

避免不必要的Hashtable

我們知道在PHP中, 類的屬性/靜態屬性/常量, 都是保存在Hashtable中的, 而在以前, 即使一個類沒有申明屬性/靜態屬性/常量, Zend引擎也會爲他們分配Hashtable.

而在現在, 這個過程被優化了, 只有在有元素的時候纔會分配Hashtable.

這樣就避免一些emalloc/efree操作, 減少一些內存佔用.

四元式優化

在PHP中, 真正執行的是Opcodes, 一個Opcodes包含3個固定的操作數, result, left, right, 在以前, 這三個操作數每一個都包含一個zval, 即使根本用不到的時候, 比如沒有右操作數的時候, 還會爲右操作數分配一個zval.

而在現在, 所有的操作數將不再直接包含zval, 而是包含一個literal table的指針, 每一個op array都會包含一個literal table.
並且znode也做了相應的調整.

這樣一來, 也能減少一些內存佔用. 從之前的(32位操作系統)一個opcode佔用72byte, 到現在的28byte.

另外, 對於string, literal table還會保存一份這個string的預先計算的hash值, 避免了在運行時多次計算. 從而提高一部分性能.

字面字符串

就好像C語言中, 代碼中的字面字符串, 會保存在一個固定段內(數據段), 在整個執行時期, 這些字符串都是常量字符串,不能被修改,不能被free.

PHP也借鑑了這樣的思想, 提出一個Internal string的概念, 在PHP代碼中的字面量字符串, 將會一次分配, 並前在整個執行期都不能被修改.

PHP在copy_zval, free zval等操作的時候, 會對internal string特別處理, 避免不必要的free和複製.

並且這些字面量字符串的hash值將會被預先計算, 這樣一來, 對於字符串比較 ==, 以及hashtable中的hash計算來說, 都可以直接使用這個預先計算的hash值, 從而能提高一部分性能.

其他

當然, 還有很多優化點, 比如優化了opcode, 減少了一些不必要的opcodes, 在此就不一一贅述了.

對比

下面是PHP開發小組內部測試的一些數據:

原生PHP, 沒有Opcode Cache:

  php-trunk patched inprovement
bench.php (sec) 4.31 3.49 19%
micro_bench.php (sec) 19.78 14.63 26%

一些實際的應用:

  php-trunk pathced improvement
blog (req/sec) 59.3 66.2 12%
drupal (req/sec) 1073.9 1084.8 1%
fw (req/sec) 105.3 111.8 6%
hello (req/sec) 5362.5 5351.4 0%
qdig (req/sec) 243.4 253.7 4%
typo3 (req/sec) 355.3 382.6 8%
wordpress (req/sec) 101.8 108.5 7%
xoops (req/sec) 70.3 78.5 12%
scrum (req/sec) 86.5 104.2 20%

從這些數據來看, 性能提升還是很明顯的..

作者: Laruence( ) 本文地址: http://www.laruence.com/2011/07/14/2115.html 轉載請註明出處
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章