Benchmark PHP

ViPHP
xTG
ViPHP | 7331 Messages

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.

ViPHP
ViPHP | 5462 Messages

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

ViPHP
xTG
ViPHP | 7331 Messages

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:

Eléphanteau du PHP | 49 Messages

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

Mammouth du PHP | 19672 Messages

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 ;)
Modifié en dernier par Cyrano le 29 déc. 2011, 01:05, modifié 1 fois.
Codez en pensant que celui qui maintiendra votre code est un psychopathe qui connait votre adresse :axe:

ViPHP
ViPHP | 5462 Messages

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)

Eléphant du PHP | 121 Messages

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.