43 votes

Performance médiocre

Je suis l'évaluation de HipHop-PHP pour la compatibilité et la performance de notre base de code, mais je suis de très mauvaise performance lors de l'exécution avec le serveur web intégré est activé.

J'ai l'exemple suivant test de programme qui calcule une suite 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 je l'exécute par le biais de 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 le standard de PHP:

root@hiphop:/www# time php -f ./ex3.php
fib(36) = 14930352

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

Cependant, lorsque je veux activer le serveur web intégré dans HHVM, tous les gains de performance 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 taks plus de 5 secondes pour traiter cette demande. Ce qui me manque?

101voto

Owen Yamauchi Points 736

HHVM ingénieur ici.

En mode serveur, HHVM va exécuter les N premières demandes qu'il voit dans les interprète mode (c'est à dire avec le JIT off).

La valeur par défaut dans une optimisation du build est N=11, donc, si vous exécutez la requête 12 fois, la 12e un serait beaucoup plus rapide.

Vous pouvez régler ce avec une option de configuration, comme suit: -v Eval.JitWarmupRequests=3. Si vous le réglez à 0, vous verrez l'accélération immédiatement.

Il ya un couple de raisons pour ce faire.

Tout d'abord, il empêche transitoire de chauffe effets affectant JIT du code compilé.

Par exemple, les quelques premières demandes peuvent avoir besoin de remplir les valeurs de l'APC, ce qui va provoquer le code de l'application pour aller des chemins différents, à partir de l'état d'équilibre de chemins. De cette façon, nous n'avons pas de perte d'espace sur le JIT de compilations qui ne sera utilisé que quelques fois.

Deuxièmement, il permet de HHVM de recueillir des informations de profilage pour améliorer l'avenir de la compilation.

Si l'on observe qu'une certaine valeur est un entier 99% du temps, par exemple, nous pouvons compiler le code est optimisé pour l'entier de cas. Nous n'avons pas actuellement la possibilité de faire JIT compiler le code avec le profilage activé (la partie la plus difficile est sécuritaire de le jeter une fois que nous aurons fait avec elle), alors que nous faisons la collecte de données dans les interprète mode.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X