2013-07-27 65 views
42

我正在評估HipHop-PHP的兼容性和性能在我們的代碼基礎上,但是在啓用內置web服務器的情況下運行時性能很差。HHVM性能不佳

我有下面的示例測試程序,可以計算斐波那契數列。

ex3.php:

function fib($n) 
{ 
    if ($n <= 2) 
     return 1; 
    else 
     return fib($n-1) + fib($n-2); 
} 

$n = 36; 
printf("fib(%d) = %d\n", $n, fib($n, 2)); 

當我使用命令行運行此通過HHVM,我得到了不俗的業績:

time hhvm -v"Eval.Jit=true" -f ./ex3.php 
fib(36) = 14930352 

real 0m0.267s 
user 0m0.248s 
sys  0m0.020s 

與標準的PHP比較:

[email protected]:/www# time php -f ./ex3.php 
fib(36) = 14930352 

real 0m5.606s 
user 0m5.600s 
sys  0m0.000s  

但是,當我想啓用HHVM中的內置Web服務器時,所有性能增益都會丟失:

hhvm -v"Eval.Jit=true" -m server -p 8000 & 
time wget -qSO - http://localhost:8000/ex3.php 
    HTTP/1.1 200 OK 
    Content-Type: text/html; charset=utf-8 
    X-Powered-By: HPHP 
    Date: Sat, 27 Jul 2013 14:16:09 GMT 
    Content-Length: 19 
fib(36) = 14930352 

real 0m5.279s 
user 0m0.000s 
sys  0m0.000s 

正如您所看到的,我從HHVM獲得響應,但它處理此請求的時間超過5秒。我錯過了什麼?

回答

97

HHVM工程師在這裏。

在服務器模式下,HHVM將運行它在僅解釋器模式下看到的前N個請求(即關閉JIT)。

優化版本中的默認值是N = 11,所以如果要運行請求12次,第12次運行速度要快得多。

你可以用一個配置選項來調整它,如下所示:-v Eval.JitWarmupRequests=3。如果將其設置爲0,則會立即看到加速。

有幾個理由要做到這一點。

首先,它防止瞬間熱身效應影響JIT編譯的代碼。

例如,前幾個請求可能需要在APC中填充值,這會導致應用程序代碼沿着來自穩態路徑的不同路徑。這樣,我們不會浪費JIT編譯的空間,這些空間只會被使用幾次。

其次,它允許HHVM收集分析信息以改進未來的編譯。例如,如果我們觀察到某個值是一個整數的99%的時間,例如,我們可以編譯針對整數情況優化的代碼。我們目前沒有設備來啓用分析功能來進行JIT編譯代碼(硬件部分在我們完成後安全地將其丟棄),所以我們在僅解釋程序模式下進行數據收集。

+0

我的nginx設置性能非常慢。如果你可以給我任何反饋在我的線程http://stackoverflow.com/questions/25147053/extremely-slow-hhvm-wordpress-nginx?rq=1 –

+0

我無法解決答案中的數據。如果有人面臨同樣的擔憂,然後訪問這些線程: 1. https://github.com/facebook/hhvm/issues/3166 2. https://github.com/facebook/hhvm/issues/900 我是沒有指定配置創建服務器,我錯了。 – Parixit

2

我有同樣的性能問題,而我只有在HHVM> V3.4 改變 Eval.JitWarmupRequests在/etc/hhvm/php.ini

;hhvm.log.level = Warning 
;hhvm.log.always_log_unhandled_exceptions = true 
;hhvm.log.runtime_error_reporting_level = 8191 
2

評論這些線後獲得不俗成績= 0 至 評估。JitProfileInterpRequests = 0

 
`#!/usr/bin/hhvm -v Eval.Jit=1 -v Eval.JitProfileInterpRequests=0 ./do.php` 
+0

哪裏是要更改的代碼?我似乎無法找到該文件的路徑。任何想法? –