PHP5 - CLASSE DE BENCHMARK

shingara Messages postés 10 Date d'inscription jeudi 14 octobre 2004 Statut Membre Dernière intervention 11 janvier 2006 - 10 janv. 2006 à 21:10
sniperdu13 Messages postés 1 Date d'inscription mercredi 17 janvier 2007 Statut Membre Dernière intervention 11 avril 2012 - 11 avril 2012 à 15:16
Cette discussion concerne un article du site. Pour la consulter dans son contexte d'origine, cliquez sur le lien ci-dessous.

https://codes-sources.commentcamarche.net/source/35497-php5-classe-de-benchmark

sniperdu13 Messages postés 1 Date d'inscription mercredi 17 janvier 2007 Statut Membre Dernière intervention 11 avril 2012
11 avril 2012 à 15:16
Juste comme ça, je me suis permis de rajouter une méthode à ta class bench().

Plutôt que de passer par des echo $bench->variable->getResult(); pour chaque variable, je fais comme ça.

public function allResult() {
foreach ($this->bench as $key => $value) {
$array[$key] = $value->getResult();
}
return Fonction::printr($array);
}

Fonction::printr() n'est qu'un print_r() entouré de balise

Moins esthétique que du echo mais plus rapide à mettre en oeuvre pour du debug ;)

Merci beaucoup pour cette class en tout cas.
dalibeaugoss Messages postés 1 Date d'inscription vendredi 11 décembre 2009 Statut Membre Dernière intervention 21 février 2010
21 févr. 2010 à 12:09
Merci groupe codes sources
kankrelune Messages postés 1293 Date d'inscription mardi 9 novembre 2004 Statut Membre Dernière intervention 21 mai 2015
18 janv. 2006 à 14:03
Sympa je ne connaissais pas la fonction magique __get()... je suis pas encore trop php5 les serveurs pour lesquels je code étant encore en php4... .. .

j'ais une class que j'avais fais et qui utilise un principe d'auto increment pour gérer automatiquement plusieurs benchmarks imbriqués sans avoir à créer un nom à chaque fois... .. .

en gros tu as un attribut $benchmarkid qui s'increment de 1 lorsqu'un bench est lancé quand tu lance le benchmark tu fais

$benchId = $monObjet->startBench('la description');

ça lance le timer et renvoi l'id du benchmark et quand tu veux stoper le bench et/ou récupérer le résultat tu fais

$monObjet->stotBench($benchId); pour juste le stoper ou $monObjet->getBench($benchId); pour le stopper, s'il ne l'est pas déja, et pour récupérer le résultat

les infos sont stocké dans un tableau comme suit...

array(
'desc' => 'le nom de la fonction testée',
'start' => 'le timer de départ',
'stop' => 'le timer de fin',
'total' => 'le résultat du benchmark',
'isFinish' => 'pour savoir si le bench est finit ou non pour le get'
),

L'avantage... t'as pas a faire de nom perso pour chaque bench vu que c'est un id numérique qui est attribué ça permet d'imbriquer des benchmark les uns dans les autres quand tu test par exemple une méthode d'une class qui fait elle même appel à d'autre méthodes... le désavantage... j'en vois pas si ce n'est peut être que les résultats sont stockés dans un taébleau un peu plus bordellique... et encore que... .. .

Voili voilou... rien de mirobolant... de toute façon pour une class de benchmark... lol... c'est juste une autre façon de faire... .. .

@ tchaOo°
FhX Messages postés 2350 Date d'inscription mercredi 13 octobre 2004 Statut Membre Dernière intervention 18 avril 2015 3
16 janv. 2006 à 18:55
Ok ok, je vais changer...

Il ne me reste plus qu'à faire une interface avec zone de texte pour pouvoir faire ca plus rapidement que de devoir taper du code à chaque fois.

Jvais concocter ca dans pas longtemps (maintenant que j'ai optimisé ma classe de DB, je vais pouvoir le faire !)
malalam Messages postés 10839 Date d'inscription lundi 24 février 2003 Statut Membre Dernière intervention 2 mars 2010 25
11 janv. 2006 à 14:26
Ouais je me suis aussi demandé pourquoi protected et pas private, en fait. Shingara a raison.
FhX Messages postés 2350 Date d'inscription mercredi 13 octobre 2004 Statut Membre Dernière intervention 18 avril 2015 3
11 janv. 2006 à 14:22
Voui, en effet j'avais mis protected mais j'aurais bien dû la mettre en private (j'avais encore le modèle de ma classe de BDD en tête avec un tas de propriétés en protégées...).

Sinon, jvais essayer de faire comme tu veux Malalam... genre une petite extension vite fait. J'avais quelque chose de très basique, je dois pouvoir facilement y rajouter 2-3 trucs allègrement :)
shingara Messages postés 10 Date d'inscription jeudi 14 octobre 2004 Statut Membre Dernière intervention 11 janvier 2006
11 janv. 2006 à 13:58
Pourquoi pas de protected, car protected n'est à utiliser que dans le cas ou tu auras des classes qui hériteront de tes classes et qui pourront modifier ces valeurs.

Personnelement, je préfére la technique :
- Tous les attributs en private
- methode getAttr() pour obtenir la valeur.

En fait c'est une technique de programmation qui se dit. Ma classe ne doit jamais pouvoir etre modifié sans que je le sache. En effet, si je crée un script qui herite de ta classe avec une simple methode qui fait :

plante(){
$this -> start() = 'echec'
}

et que je lance la methode getResult(), j'obtiens une erreur.

Enfin chacun sont truc :)
malalam Messages postés 10839 Date d'inscription lundi 24 février 2003 Statut Membre Dernière intervention 2 mars 2010 25
11 janv. 2006 à 13:48
Si si c'est ça. Enfin, je VEUX...c'est une suggestion hein, lol.
FhX Messages postés 2350 Date d'inscription mercredi 13 octobre 2004 Statut Membre Dernière intervention 18 avril 2015 3
11 janv. 2006 à 13:43
Arf, c'est mal passé...


Quelle merde ce truc des fois... je reprend :


$sql1 --> 'Requète 1' => Calculer différence de temps
--> 'Requète 2' => Ou sortir la requète la plus rapide.


C'est ca ou pas du tout ?
malalam Messages postés 10839 Date d'inscription lundi 24 février 2003 Statut Membre Dernière intervention 2 mars 2010 25
11 janv. 2006 à 12:37
Hello,

po mal :-)

Pour $time, dans la mesure où ce résultat est récupéré via une méthode, je ne vois pas d'inconvénient à ce qu'elle ne soit pas accessible directement.

Pour __get(), pourquoi pas, c'est élégant.
Moi j'aime bien.

Par contre, 3 fois rien, mais j'aurais bien ajouté un commentaire à tes bench. je veux dire, la possibilité d'ajouter un commentaire (typiquement, pour une requête sql puisque tu prends cet exemple : la requête elle-même).

Voire un état statistique ;-) Je m'explique : polusieurs bench associé à 1 élément. je reprends l'exemple des requêtes sql : au lieu de créer plusieurs éléments (sql1, sql2), donner la possibilité de créer plusieurs bench pour 1 élément : slq1, avec des benchs différents pour chaque modification apportée à la requête : 'SELECT nom, prenom FROM personnes' est-il plus rapide que 'SELECT * FROM personnes'...cela se rapporte à la même requête en fait. Puis sortir avec le getResult, la requête effectuée, et le temps, pour ce sql1 que l'on teste. Tu saisis ?
FhX Messages postés 2350 Date d'inscription mercredi 13 octobre 2004 Statut Membre Dernière intervention 18 avril 2015 3
10 janv. 2006 à 22:57
"Je ne suis pas trop d'accord avec les variables de classes protected." Pourquoi donc ?
$start et $stop ne servent qu'à l'interieur de la classe.
$time pourrait servir en dehord de la classe, j'aurais pu la mettre public.

$bench doit resté protégé car ca ne sert à rien de la mettre en public.
Vaut il mieux faire :
$bench->page->getResult();
plutot que :
$bench->bench['page']->getResult(); ?

C'est au choix, moi je préfère la première. Voila pourquoi j'utilise la méthode __get(). Elle est faite pour ca, autant l'utiliser !

Bien sur, y'a un paquet de méthode pour faire un chronomètre, j'aurais pu le faire en une seule classe en rappelant à chaque fois le nom_du_bench à chaque méthode, mais aucun intérêt de faire de l'objet dans ce cas la.

Mais tu as un point de vue différent, et je serais bien content de le connaitre jusqu'au bout :)
shingara Messages postés 10 Date d'inscription jeudi 14 octobre 2004 Statut Membre Dernière intervention 11 janvier 2006
10 janv. 2006 à 21:10
Je ne suis pas trop d'accord avec les variables de classes protected. Mais c'est surement une question de gestion de classe propre à chacun.

Sinon, je suis pas forcement sur que ca sert vraiment à quelque chose de mettre cette fonction _get()
Rejoignez-nous