PHP7 出來之後,HHVM 還有什麼優勢嗎?
就拿跑WordPress這些PHP Web應用來說,PHP7性能跟HHVM是同一水準,也就是說,HHVM在性能上,對比PHP7,不具備明顯優勢.
下面說說HHVM的劣勢:
多線程的HHVM穩定性不如多進程的PHP-FPM.
服務冷啟動熱身時,HHVM性能堪憂,而PHP則較為平穩.所以採用HHVM的大型網站的運維人員,代碼首次上線時,需要預先生成PHP腳本的bytecode,讓HHVM在啟動時就能直接跑hhvm.hhbc里的bytecode.雖然PHP7也支持opcache.file_cache + opcache_compile_file持久化存儲PHP腳本的opcode到文件系統,不過PHP運行時在共享內存生成opcode的速度很快,加上多進程,冷啟動也能輕鬆應對.
Facebook的HHVM團隊只提供了適用於64位Ubuntu/Debian的預編譯二進位包,也就是Facebook用的都是Debian系的Linux伺服器.而國內,比如百度,用的應該是Redhat系的伺服器,那怎麼辦?那就得自己下載源代碼編譯.而HHVM的編譯要比PHP複雜不少.
HHVM目前只支持Linux系統,不支持Windows.而PHP支持大多數操作系統,Linux/Windows/OSX自不必多說,要跑在Android(參考應用KSWeb)和iOS(參考應用DraftCode)上也不是問題,跑在路由器OpenWrt上也行.比如我自己就交叉編譯了能夠運行在Android(小米4)上的PHP7.1和OpenWrt(小米路由器mini)上的PHP7.1,交叉編譯工具鏈分別用的是arm-linux-musleabi和mipsel-openwrt-linux-uclibc.
PHP從5.4開始就內置了HTTP伺服器,一樣能做到開發測試時開箱即用.所以內置HTTP伺服器也不是HHVM的優勢.也就是說,你在Windows下載一個PHP的ZIP包,解壓後在cmd.exe里執行 php.exe -S 127.0.0.1:8080 -t D:www 然後打開瀏覽器訪問 http://127.0.0.1:8080 就能進行PHP開發了.
最後再測試一個PHP中最常用的數據結構"有序的關聯數組".
這種結構在其他語言里一般叫做"字典",不過普遍都是沒有順序的.
測試內容是生成一個包含100萬個元素的關聯數組.
測試環境是Ubuntu 14.04 (i5-3230M), HHVM 3.8.1(已熱身), PHP 7.1.5.
測試結果是PHP7稍微比HHVM快一點.
cat hash.php time hhvm hash.php time php hash.php
&
# HHVM 3.8.1
0.66459989547729
real 0m0.803s
user 0m0.731s
sys 0m0.072s
# PHP 7.1.5
0.58299088478088
real 0m0.596s
user 0m0.588s
sys 0m0.008s
另外,PHP也在推進基於opcache可拔插的JIT項目,在php-src/Zend/bench.php測試中,PHP JIT測試分支的速度差不多是PHP 5.4的10倍,也就是說,綜合計算性能提升了一個數量級.在一些特殊的場景,比如Mandelbrot演算法上,相比無JIT的PHP7,甚至獲得了30倍的速度提升.對於重視密集計算的PHP腳本而言,JIT是個好消息.但如果你的腳本並非計算密集,那JIT並不會給你帶來什麼驚喜.
hhvm肯定沒有市場了。其實hhvm本來也沒有多少公司在用,主要是facebook。
php7的性能和hhvm的性能已經相差無幾,但hhvm的運維成本要高多了。
都沒說到點子上。
hhvm的關鍵是Hack語言,用於分析錯誤,提高代碼質量。現在php 7語言特性已經超過hack了,hhvm沒有優勢。客觀點說 PHP7 性能還不錯的 ~ 不過畢竟正式版也出來沒多久 和經過實踐的HHVM 還是有一些差距 ~而且 現在很多公司的代碼 還很舊 未來在很長一段時間 HHVM 還是很有市場的 ~
hhvm理論上可以讓php變成靜態語言,比如程序啟動時將分類重資料庫讀到內存,以後不用重新解析.而php目前還是每次請求都是獨立的,需要重新解析.所以如果都是優化好的程序,理論上hhvm更快.但實際需要優化太多,大部分項目不需要,所以還是php7比較好
如果沒有一個數量級以上的性能差距
只能說結果就是官方逼死同人
推薦閱讀:
※swoole啟動2萬個定時器對性能有影響嗎?
※現在國內中小型的IT行業的公司,asp.net和php哪個應用得比較普遍?
※如何編寫不可維護的php代碼?
※「Facebook 開發的高性能PHP虛擬機 HHVM 比官方的 PHP解釋器 快超過9倍」的說法是否屬實?
※Zend opcode是如何被執行的?是要編譯為機器碼再執行嗎?