2013-07-27 2 views
42

Я оцениваю HipHop-PHP для совместимости и производительности на нашей базе кода, но при работе с встроенным веб-сервером я получаю очень низкую производительность.Низкая производительность 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, все потери производительности теряются:

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

У меня такая же проблема с производительностью, и я получить впечатляющие результаты только после того, как комментируя эти строки в /etc/hhvm/php.ini

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

если HHVM> v3.4 Изменено Eval.JitWarmupRequests = 0 до Eval.JitProfileInterpRequests = 0

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

где это код, который нужно изменить? Я не могу найти путь к этому файлу. Есть идеи? –

 Смежные вопросы

  • Нет связанных вопросов^_^