Benchmark PHP

Répondre


Cette question est un moyen d’empêcher des soumissions automatisées de formulaires par des robots.
Smileys
:D :) :( :o :shock: :? 8-) :lol: :x :P :oops: :cry: :evil: :twisted: :roll: :wink: :!: :?: :idea: :arrow: :| :mrgreen: =D> #-o =P~ :^o :non: :priere: 8-|
Voir plus de smileys
  Revue du sujet
 

  Étendre la vue Revue du sujet : Benchmark PHP

Re: Benchmark PHP

par Gofromiel » 13 janv. 2012, 01:00

Je trouve dommage que l'auteur du site n'indique ni à quelle date ont été réalisés les tests ni même la version de PHP utilisée. N'y a-t-il pas des cas qui s'améliorent avec le temps, surtout depuis que PHP a changé de compilateur ? Cela dit, ça reste informatif.

Re: Benchmark PHP

par stealth35 » 29 déc. 2011, 00:48

stealth35, ça veut dire quoi ta phrase concernant "l'opcode", que ce n'est pas complètement fiable ce genre de tests?
Merci d'avance
pour exécuter un fichier PHP y'a plusieurs étape, dont une de compilation, de code est converti en opcode (voir l'extension VLD) après un phase de tokenization, l'opcode ressemble a de l'assembleur, c'est ce code qui est exécuté

donc : tokenization -> compilation -> exécution
tout ce qui est compté en terme de temps (avec microtome et compagnie) débute uniquement a partir de l'exécution, tout ce qui avant n'est pas pris en compte,
Un extension comme APC permet de ne faire qu'une seule fois les deux première étape, puisque pour un mémé script l'opcode reste le même, ça fait du travaille en moins donc l'appli est plus rapide

et le fameux débat entre les double quote et single avec bench a l'appuie est ridicule puisque cette déférence est subite au moment de la tokenization donc incalculable au moment de l'exécution

Exemple :
echo 'hello'; VS echo "hello";
echo 'hello';
number of ops:  3
compiled vars:  none
line     # *  op                           fetch          ext  return  operands
---------------------------------------------------------------------------------
   2     0  >   EXT_STMT                                                 
         1      ECHO                                                     'hello'
         2    > RETURN                                                   1

branch: #  0; line:     2-    2; sop:     0; eop:     2
echo "hello";
number of ops:  3
compiled vars:  none
line     # *  op                           fetch          ext  return  operands
---------------------------------------------------------------------------------
   2     0  >   EXT_STMT                                                 
         1      ECHO                                                     'hello'
         2    > RETURN                                                   1

branch: #  0; line:     2-    2; sop:     0; eop:     2
c'est pareil

par contre, faire ça c'est pas top
$text = 'hello';
echo "$text";
number of ops:  6
compiled vars:  !0 = $text
line     # *  op                           fetch          ext  return  operands
---------------------------------------------------------------------------------
   2     0  >   EXT_STMT                                                 
         1      ASSIGN                                                   !0, 'hello'
   3     2      EXT_STMT                                                 
         3      ADD_VAR                                          ~1      !0
         4      ECHO                                                     ~1
         5    > RETURN                                                   1

branch: #  0; line:     2-    3; sop:     0; eop:     5
$text = 'hello';
echo $text;
number of ops:  5
compiled vars:  !0 = $text
line     # *  op                           fetch          ext  return  operands
---------------------------------------------------------------------------------
   2     0  >   EXT_STMT                                                 
         1      ASSIGN                                                   !0, 'hello'
   3     2      EXT_STMT                                                 
         3      ECHO                                                     !0
         4    > RETURN                                                   1

branch: #  0; line:     2-    3; sop:     0; eop:     4
Donc l'indication que tu donne stealth35 déplace le comptage dans la première partie qui n'est exécutée qu'une seule fois au lieu de la laisser dans la seconde où elle sera exécutée à chaque tour. Ainsi, un count va ou non être exécuté plusieurs fois... pour retourner toujours le même résultat, répétition qui, tu en conviendras, est totalement sans intérêt
je pense que le Ainsi donne un sens bizarre à ton explication (que j'ai déjà donnée)

Re: Benchmark PHP

par Cyrano » 28 déc. 2011, 12:46

En effet, mais c'est assez tordu tout de même comme écriture...
Jamais je n'aurai pu imaginer qu'on puisse écrire plusieurs lignes de code (et non des expressions) dedans. :shock:
Ce n'est pas si tordu que ça : un « for » attend trois expressions en paramètres :
  1. Une ou plusieurs expressions séparées par des virgules définissant une situation au lancement de la boucle : ces expressions ne seront exécutées qu'une unique fois avant le premier tour;
  2. Une expression retournant un booléen indiquant si on doit ou non continuer à boucler;
  3. Une ou plusieurs expressions séparées par des virgules indiquant des actions à effectuer à la fin de chaque tour;
Donc l'indication que te donne stealth35 déplace le comptage dans la première partie qui n'est exécutée qu'une seule fois au lieu de la laisser dans la seconde où elle sera exécutée à chaque tour. Ainsi, un count va ou non être exécuté plusieurs fois... pour retourner toujours le même résultat, répétition qui, tu en conviendras, est totalement sans intérêt ;)

Re: Benchmark PHP

par liens_geeks » 27 déc. 2011, 23:19

stealth35, ça veut dire quoi ta phrase concernant "l'opcode", que ce n'est pas complètement fiable ce genre de tests?
Merci d'avance

Re: Benchmark PHP

par xTG » 26 déc. 2011, 09:44

En effet, mais c'est assez tordu tout de même comme écriture...
Jamais je n'aurai pu imaginer qu'on puisse écrire plusieurs lignes de code (et non des expressions) dedans. :shock:

Re: Benchmark PHP

par stealth35 » 26 déc. 2011, 03:52

faut faire gaffe avec ce genre de tests puisque c'est uniquement l'exécution de l'opcode, pour le count c'est normale il est exécuter a chaque tour de boucle, il faut le mettre dans la première expression
for ($i = 0, $size = count($x); $i < $size; $i++) 
et non pas
for ($i = 0; $i < count($x); $i++)
beaucoup oublie qu'on peux mettre ce qu'on veux comme expression dans un for

Benchmark PHP

par xTG » 25 déc. 2011, 17:41

Je suis par hasard tombé sur http://www.phpbench.com/ qui propose une liste de benchmark de différentes écritures.
Assez intéressant à parcourir, on y voit par exemple qu'un count() d'un tableau dans une boucle for prend bizarrement un temps monstrueux par rapport à une constante calculée.