J'évalue HipHop-PHP pour la compatibilité et les performances sur notre base de code, mais j'obtiens de très mauvaises performances lorsque je l'exécute avec le serveur Web intégré activé.
J'ai l'exemple de programme de test suivant qui calcule une séquence de Fibonacci.
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));
Lorsque j'exécute cela via HHVM à l'aide de la ligne de commande, j'obtiens des résultats impressionnants:
time hhvm -v"Eval.Jit=true" -f ./ex3.php
fib(36) = 14930352
real 0m0.267s
user 0m0.248s
sys 0m0.020s
Comparez cela avec PHP standard:
root@hiphop:/www# time php -f ./ex3.php
fib(36) = 14930352
real 0m5.606s
user 0m5.600s
sys 0m0.000s
Cependant, lorsque je souhaite activer le serveur Web intégré dans HHVM, tous les gains de performances sont perdus:
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
Comme vous pouvez le voir, je reçois la réponse de HHVM, mais il lui faut plus de 5 secondes pour traiter cette demande. Qu'est-ce que je rate?
Ingénieur HHVM ici.
En mode serveur, HHVM exécutera les premières N requêtes qu'il voit en mode interprète uniquement (c'est-à-dire avec le JIT désactivé).
La valeur par défaut dans une version optimisée est N = 11, donc si vous exécutez la demande 12 fois, la 12e serait beaucoup plus rapide.
Vous pouvez régler cela avec une option de configuration, comme ceci: -v Eval.JitWarmupRequests=3
. Si vous le définissez sur 0, vous verrez immédiatement l'accélération.
Il y a plusieurs raisons à cela.
Tout d'abord, il empêche les effets de réchauffement transitoires d'affecter le code compilé par JIT.
Par exemple, les premières demandes peuvent nécessiter de remplir des valeurs dans APC, ce qui entraînera le code d'application à descendre sur des chemins différents des chemins en régime permanent. De cette façon, nous ne perdons pas d'espace sur les compilations JIT qui ne seront utilisées que quelques fois.
Deuxièmement, il permet à HHVM de collecter des informations de profilage pour améliorer la future compilation.
Si nous observons qu'une certaine valeur est un entier 99% du temps, par exemple, nous pouvons compiler du code optimisé pour le cas entier. Nous n'avons actuellement pas la possibilité de compiler du code JIT avec le profilage activé (la partie difficile est de le jeter en toute sécurité une fois que nous en avons terminé), nous effectuons donc la collecte de données en mode interprète uniquement.
J'ai le même problème de performances et j'obtiens des résultats impressionnants uniquement après avoir commenté ces lignes dans /etc/hhvm/php.ini
;hhvm.log.level = Warning
;hhvm.log.always_log_unhandled_exceptions = true
;hhvm.log.runtime_error_reporting_level = 8191
si HHVM> v3.4 a changé Eval.JitWarmupRequests = 0 en Eval.JitProfileInterpRequests = 0
`#!/usr/bin/hhvm -v Eval.Jit = 1 -v Eval.JitProfileInterpRequests = 0 ./do.php`