begin process at 2012 05 27 17:57:00
  Trouver un code source :
 
dans
 
Accueil > 

Code

 > 

Class et Objet ( POO )

 > PHP5 - CLASSE DE BENCHMARK

PHP5 - CLASSE DE BENCHMARK


 Information sur la source

Note :
8,4 / 10 - par 5 personnes
8,40 / 10

  • 1

  • 2

  • 3

  • 4

  • 5

  • 6

  • 7

  • 8

  • 9

  • 10
Catégorie :Class et Objet ( POO ) Classé sous :bench, benchmark, php5, get, class Niveau :Initié Date de création :10/01/2006 Vu :5 497

Auteur : FhX

Ecrire un message privé
Commentaire sur cette source (12)
Ajouter un commentaire et/ou une note

 Description

Bon bah voila, plutôt que devoir se taper 40 fois l'écriture de "microtime(true)", de devoir se taper 40 fois les opérations à écrire $stop-$start... je me suis dit : Autant que j'automatise ça et au plus vite !

Alors j'ai fait une petite classe... non en faite j'en ai fait deux. Pourquoi 2 ? La première classe (mark) sert à instancier chaque benchmark en une classe. La seconde classe (bench) permet d'interfacer la classe mark avec le programmeur.
Pourquoi avoir fait ca ? Parce que je trouve que c'est plus jolie à faire et que ca rend le coté orienté objet un peu plus concret comme ca.

Ma classe gère le multi-benching au passage, donc vous pouvez lancer 40 benchs en même temps, ca marchera très bien :)
Mais voyons le code en détail :

Source

  • <?php
  • <?php
  • class bench {
  • protected $bench = array(); // Contient tous les marqueurs de bench
  • public function __construct($name) {
  • $this->init($name); // Initialisation du premier marqueur (obligatoire) à l'instanciation de classe.
  • }
  • public function init($name) {
  • $this->bench[$name] = new mark;
  • }
  • public function __get($name) { // Méthode magique (j'expliquerai plus loin)
  • if ( isset($this->bench[$name]) ) {
  • return $this->bench[$name];
  • } else {
  • throw new Exception ($name.' n\'existe pas en tant que marque de bench !');
  • }
  • }
  • }
  • class mark {
  • protected $start; // Début du compteur
  • protected $stop; // Fin de compteur
  • protected $time; // Résultat du bench
  • final public function start() {
  • $this->start = microtime(true);
  • }
  • final public function stop() {
  • $this->stop = microtime(true);
  • }
  • final public function getResult() {
  • $this->time = $this->stop - $this->start;
  • return $this->time;
  • }
  • }
  • ?>
  • <?php
  • /* Bon jusque la, la lecture est vraiment très simple. Il n'y a que pour le __get que je vais vous expliquer (pour ceux qui ne le savent pas !). */
  • // J'instancie ma classe bench en premier, avec comme argument le nom du bench que je vais réaliser.
  • $bench = new bench('page');
  • // Ici, je vais bencher toute ma page !
  • // Je commence donc maintenant :
  • $bench->page->start();
  • /* Et oui, le 'page' que j'ai passé en argument est devenu un objet ! Cela est réalisable grâce à la méthode magique __get. En effet, si on regarde bien le code, je n'ai pas déclaré de paramètre $page à ma classe... mais seulement $bench qui est un tableau ! Grâce à _get() je vais faire la relation entre le tableau $bench qui est comme ca : $bench = array( 'page' => object(mark) ) et le paramètre $page qui lui n'existe pas ! */
  • // On continu donc l'éxécution de la page :
  • <p></p>
  • <a></a>
  • // hop, fin de page, j'arrète le chrono :
  • $bench->page->stop();
  • // Je récupère pour pouvoir visualiser le temps d'éxécution :
  • echo $bench->page->getResult();
  • // Et voila comment on bench une page facilement ! Maintenant plus compliquer, je vais faire trois bench... deux pour des requètes SQL, une pour ma page entière !
  • $bench = new bench('page');
  • $bench->init('sql1');
  • $bench->init('sql2');
  • $bench->page->start();
  • $sql = "SELECT .....";
  • $bench->sql1->start();
  • $query = mysql_query($sql);
  • $bench->sql1->stop();
  • echo mysql_num_rows($query);
  • $sql = "SELECT .....";
  • $bench->sql2->start();
  • $query = mysql_query($sql);
  • $bench->sql2->stop();
  • // suite du code
  • // On arrive à la fin :
  • $bench->page->stop();
  • // On affiche le tout :
  • echo 'Bench :<br /><br />';
  • echo 'Query 1 : '.$bench->sql1->getResult().' <br />';
  • echo 'Query 2 : '.$bench->sql2->getResult().' <br />';
  • echo 'Page : '.$bench->page->getResult().' <br />';
  • ?>
<?php
<?php
class bench {
 
 protected $bench = array(); // Contient tous les marqueurs de bench
  
 public function __construct($name) {
  $this->init($name); // Initialisation du premier marqueur (obligatoire) à l'instanciation de classe.
 }
 
 public function init($name) {
  $this->bench[$name] = new mark;
 }
 
 public function __get($name) { // Méthode magique (j'expliquerai plus loin)
  
   if ( isset($this->bench[$name]) ) {
        return $this->bench[$name];
   } else {
        throw new Exception ($name.' n\'existe pas en tant que marque de bench !');
   }
  
  }

}

class mark {

 protected $start; // Début du compteur
 protected $stop; // Fin de compteur
 protected $time; // Résultat du bench

 final public function start() {
  $this->start = microtime(true);
 }
 
 final public function stop() {
  $this->stop = microtime(true);
 }
 
 final public function getResult() {
  $this->time = $this->stop - $this->start;
  return $this->time;
 }
 
}
?>
<?php
/* Bon jusque la, la lecture est vraiment très simple. Il n'y a que pour le __get que je vais vous expliquer (pour ceux qui ne le savent pas !). */
// J'instancie ma classe bench en premier, avec comme argument le nom du bench que je vais réaliser.
$bench = new bench('page');

// Ici, je vais bencher toute ma page !
// Je commence donc maintenant :
$bench->page->start();

/* Et oui, le 'page' que j'ai passé en argument est devenu un objet ! Cela est réalisable grâce à la méthode magique __get. En effet, si on regarde bien le code, je n'ai pas déclaré de paramètre $page à ma classe... mais seulement $bench qui est un tableau ! Grâce à _get() je vais faire la relation entre le tableau $bench qui est comme ca : $bench = array( 'page' => object(mark) ) et le paramètre $page qui lui n'existe pas ! */

// On continu donc l'éxécution de la page :
<p></p>
<a></a>

// hop, fin de page, j'arrète le chrono :
$bench->page->stop();

// Je récupère pour pouvoir visualiser le temps d'éxécution :
echo $bench->page->getResult();

// Et voila comment on bench une page facilement ! Maintenant plus compliquer, je vais faire trois bench... deux pour des requètes SQL, une pour ma page entière !

$bench = new bench('page');
$bench->init('sql1');
$bench->init('sql2');

$bench->page->start();

$sql = "SELECT .....";
$bench->sql1->start();
$query = mysql_query($sql);
$bench->sql1->stop();

echo mysql_num_rows($query);

$sql = "SELECT .....";
$bench->sql2->start();
$query = mysql_query($sql);
$bench->sql2->stop();

// suite du code 

// On arrive à la fin :
$bench->page->stop();
// On affiche le tout :
echo 'Bench :<br /><br />';
echo 'Query 1 : '.$bench->sql1->getResult().' <br />';
echo 'Query 2 : '.$bench->sql2->getResult().' <br />';
echo 'Page : '.$bench->page->getResult().' <br />';
?> 
 

 Conclusion

Bon, c'est tout simple... mais au moins, ca aide au niveau d'un benchmark rapide et efficace.
Je n'ai fait aucune gestion d'erreur, ca viendra un peu plus tard :)

C'est parce que Coucou747 m'a demandé une gestion de bench sur mon ancienne classe que je me suis dit de developper quelque chose comme ca.

Si y'a des trucs à modifier, astuces où autres améliorations, je suis toujours preneur !

Merci :)
Ps : Je met en Initié car j'utilise le principe de la méthode magique __get()... autrement c'est tout simple !


 Sources du même auteur

PHP5 - UTILISATION DES ITÉRATEURS ET DE LA RÉFLECTION.
PHP 5 - CLASSE MYSQL (STYLE MYSQLI)
[PHP5] CLASSE DATE/HEURE
PHP5 - GESTION DE MODULES EN OBJET
PHP5 - CLASSE DE NEWS ET DE COMMENTAIRES

 Sources de la même categorie

Source avec Zip GÉNÉRATION AUTOMATIQUE DE FICHIER .CLASS.PHP EN FONCTION D'U... par ig3
CLASSE D'OBJET DE CRYPTAGE ET DÉCRYPTAGE DE CHAINES DE CARAC... par 8Tnerolf8
Source avec Zip MY.DEVIANTART API par inwebo
CLASSE DE GESTION DE "VARIABLES GLOBALES D'ENVIRONNEMENT" par pifou25
Source avec Zip COLLECTION.CLASS.MIN.PHP par thunderhunter

 Sources en rapport avec celle ci

CLASS RECHERCHE PHP5 POO par mtrix000
CLASS AUTHENTIFICATION PHP5 POO par mtrix000
CLASS PAGINATION PHP5 POO par mtrix000
SYSTÈME DE CACHE POUR SITE EN PHP5 par Petit bateau
Source avec Zip Source avec une capture CLASS DE MENU DÉROULANT PHP5 par cedriclomb

Commentaires et avis

Commentaire de shingara le 10/01/2006 21:10:19

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()

Commentaire de FhX le 10/01/2006 22:57:09

"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 :)

Commentaire de malalam le 11/01/2006 12:37:03 administrateur CS

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 ?

Commentaire de FhX le 11/01/2006 13:43:45

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 ?

Commentaire de malalam le 11/01/2006 13:48:05 administrateur CS

Si si c'est ça. Enfin, je VEUX...c'est une suggestion hein, lol.

Commentaire de shingara le 11/01/2006 13:58:40

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 :)

Commentaire de FhX le 11/01/2006 14:22:28

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 :)

Commentaire de malalam le 11/01/2006 14:26:37 administrateur CS

Ouais je me suis aussi demandé pourquoi protected et pas private, en fait. Shingara a raison.

Commentaire de FhX le 16/01/2006 18:55:10

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 !)

Commentaire de kankrelune le 18/01/2006 14:03:25

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°

Commentaire de dalibeaugoss le 21/02/2010 12:09:46

Merci groupe codes sources

Commentaire de sniperdu13 le 11/04/2012 15:16:16 9/10

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 <pre></pre>

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

Merci beaucoup pour cette class en tout cas.

 Ajouter un commentaire


Discussions en rapport avec ce code source dans le forum

Bench de class ? [ par Teclis01 ] Voila je me promenais un jour de printemps sur ce joli forum tout venu de rose et ... j'ai vu que certains parlait de bench de class ... Et je voudrai function get_called_class() [ par tafsne ] salutj'ai essayé la fonction get_called_class() en php5 avec non éditeur zend et easy php 2.0 béta mé sa ne marche passvp si vous pouvez m'aider Problème avec file_get_contents [ par Tetsuo30 ] Bonjour,j'ai un petit problème avec le fonction file_get_contentsVoici mon code :&lt;?php$texte = file_get_contents('test.txt'); ?&gt;Le but c est Tutoriel sur les CLASS [ par patric31 ] Bonjour à toutes et à tous,Je suis à la recherche d'un tuto sur les CLASS.Quelque chose de simple, qui parte du B.A-BA pour pouvoir en créer et m'en s memory_get_peak_usage et domdocument [ par craso ] Bonjour,Voici un code de test:&lt;?php$fichier = 'test_do.xml';$cp = 'test_dom_cp.xml';// ce fichier fait 12 Mopassthru('cp '.$cp.' '.$fichier);$dom = Comment passer des variables d'un script a un autre [ par badind ] Bonjour,J'avais un site écrit en php3 ( http://badind.chez-alice.fr/RandoGl ), mais le Fai vient de passer en Php5. Le transfert de données entre scri Aide pour passer des scripts album/diaporama/... de Php3 en php5 [ par badind ] Bonjour,J'ai écrit il y a quelques années des scripts que je souhaitrai faire évoluer en php5.Il s'agit d'un multi-albums photos : vignettes, defileme Caddie : récupérer le prix et calculer les montants HT, TTC, TVA [ par azigui ] Bonjour à tous,Y'aurait-il un bonne âme pour m'aider. Voilà je débute en PHP, je dois créer un panier.J'ai réussi à faire de l'incrémentation et de la MAJ php4.2 vers php5 [ par The_Dark_Samoura ] Bonjour j'ai créer un site pour une société qui fonctionne sur mon ordi mais je me suis rendu compte que la version de php sur le serveur UNIX est 4 m compatibilité php4 et php5 [ par fanfanfx ] Bonjour, Je cherche l'équivalent de la classe COM qui était présente dans php4 et qui ne l'ai plus dans php5. Du coup, mon code qui convertissait des


Nos sponsors


Sondage...

Comparez les prix

CalendriCode

Mai 2012
LMMJVSD
 123456
78910111213
14151617181920
21222324252627
28293031   

Consulter la suite du CalendriCode

A découvrir



 
Développement réalisé par Nicolas SOREL (Nix) avec l'aide de : Cyril DURAND et Emmanuel (EBArtSoft), Merci à Vincent pour ses précieux conseils.
CodeS-SourceS.com© Toute reproduction même partielle est interdite sauf accord écrit du Webmaster
CodeS-SourceS.com© est une marque déposée tous droits réservés

Google Coop CodeS-SourceS Google Coop CodeS-SourceS
Temps d'éxécution de la page : 1,170 sec (4)

Nous contacter | Annoncer sur CodeS-SourceS | Mentions légales