Optimisation de scripts PHP, comment la calculer.

Optimisation de scripts PHP, comment la calculer. - PHP - Programmation

Marsh Posté le 29-07-2005 à 19:31:35    

Voilà, j'ai une méthode un peu particulière pour optimiser mes programmes PHP et comme justement, j'étais en train de bosser dessus, je me suis dit que l'idée pourrait intéresser certains et qu'éventuellement, ceux qui ont d'autres méthodes de travail pourraient conseiller la leur.  
J'ai d'abord voulu poster ce message dans le sujet Optimisation né il y a quelquejours, mais il concerne surtout l'intéraction MySQL/PHP alors que ma méthode (qui n'a rien de révolutionnaire, je m'en doute) concerne n'importe quel programme en PHP.
 
Alors voilà ce que je fais, je place une fonction au tout début de mon script, en général, je la met directement dans le fichier d'appel à la bdd, comme ça, je suis sûr que la fonction sera dispo sur n'importe quelle page du site.
Voici la fonction :

Code :
  1. $ToutCommeMicrotime=getmicrotime();
  2. function calctaf($operation) {
  3. global $totalcalculopefct;
  4. global $ToutCommeMicrotime;
  5. global $tcalcretdep;
  6. $tcalcdep = getmicrotime();
  7. $totalcalculopefct.=substr(($tcalcdep-$ToutCommeMicrotime),0,7).' sec (<b>'.substr(($tcalcdep-$tcalcretdep),0,7).'</b> ) => '.$operation.'<br />';
  8. $tcalcretdep=$tcalcdep;
  9. }
  10. function getmicrotime() {
  11.    $mtime = microtime();
  12.    $mtime = explode(" ",$mtime);
  13.    $mtime = $mtime[1] + $mtime[0];
  14.    return ($mtime);
  15. }


 
Ensuite, dans mes scripts, au lieu de commenter bêtement avec // je fais un appel à la fonction, par exemple au lieu de mettre :

Code :
  1. // Ceci est le début d\'une boucle
  2. for ($i<0;...


à la place, je met

Code :
  1. calctaf('Ceci est le début d\'une boucle');
  2. for ($i<0;...


 
Tout à la fin de mon script, je n'ai plus qu'à rajouter :

Code :
  1. echo $totalcalculopefct;


 
Résultat, si j'ai bien commenté mon script grace à calctaf(), je sais tout de suite les routines qui pénalisent le plus le temps de génération de la page.
A part le premier chiffre, la fonction va détailler autant que de calctaf( dans le script, en indiquant en premier, le temps depuis le début du script et entre parenthèse, le temps qu'il s'est passé depuis le dernier appel à calctab(), ça permet de mesurer précisément l'intervalle entre 2 points.  
Résultat, utiliser ma fonction ne m'a pas pris plus de temps que de bien commenter mes scripts, mais grace à elle, je peux facilement trouver les points où ça pêche et les améliorer.
 
Une fois mon script au point, je n'ai plus qu'à faire un remplacer rechercher dans Dream (mais tout éditeur doit savoir le faire) sur tout mon site en demandant à remplace "caltaf(" par "//-*->" et à transformer en commentaire la dernière ligne de mon script.
 
Les questions qu'on pourrait me poser (Ma FAQ de schizophrène où c'est mon coté débile qui pose des questions à mon coté intelligent) :
 
Pourquoi t'as des noms de variable à la con dans ta fonction ?
=> C'est juste pour éviter que les variables de la fonction n'aient aucune chance d'interférer avec les variables du script vu qu'elles sont globales
 
Ca prend du temps machine ton truc là ?
=> Oui, comme toute fonction, mais ce temps est ridicule, surtout comparé au temps que ça peut faire gagner pour optimiser un script.
 
Ce serait pas un peu de la merde ta fonction ?
=> C'est pour ça que je poste ça sur le forum, si quelqu'un a une meilleure méthode, je demande qu'à savoir.
 
Tu crois pas que tous les pros le savent depuis 10 ans ta méthode à 2 balles ?
=> Va savoir, en tout cas, ça fait 2 ans que je surf sur les sites de PHP et à part la fonction getmicrotime que j'ai chopé je sais plus où, j'ai jamais vu de truc tout fait pour bien calculer le temps d'un script.
 
Pourquoi tu remplaces calctaf( par //-*-> et pas simplement par // ?
=> Pour pouvoir revenir en arrière et refaire un rechercher remplacer sur //-*-> sans que ça renomme mes commentaires // standard (parce que j'en mets quand même un peu).
 
Tu sais que tout le monde s'en fout et que personne risque de répondre à ton topic
=> Ouai, mais spa grave, si un newb passe par ici et qu'il fait une recherche sur optimisation PHP, il tombera peut-être sur le sujet et ça pourra le dépanner autant que ça me dépanne.
 
Et ta femme elle en pense quoi ?
=> Ma femme elle en pense que je devrais passer moins de temps sur les forums et que je devrais bosser un peu plus sur son site.
 
 
 
 
L'exemple bateau qui tue :

Code :
  1. <?php
  2. $ToutCommeMicrotime=getmicrotime();
  3. function calctaf($operation) {
  4. global $totalcalculopefct;
  5. global $ToutCommeMicrotime;
  6. global $tcalcretdep;
  7. $tcalcdep = getmicrotime();
  8. $totalcalculopefct.=substr(($tcalcdep-$ToutCommeMicrotime),0,7).' sec (<b>'.substr(($tcalcdep-$tcalcretdep),0,7).'</b> ) => '.$operation.'<br />';
  9. $tcalcretdep=$tcalcdep;
  10. }
  11. function getmicrotime() {
  12.    $mtime = microtime();
  13.    $mtime = explode(" ",$mtime);
  14.    $mtime = $mtime[1] + $mtime[0];
  15.    return ($mtime);
  16. }
  17. calctaf('Le script commence');
  18. for ($i=0;$i<10000;$i++) {
  19. $random=rand(0,2000);
  20. }
  21. calctaf('je viens de faire une petite boucle de 10000 pour m\'amuser');
  22. for ($i=0;$i<100000;$i++) {
  23. $random=rand(0,2000);
  24. }
  25. calctaf('je viens de faire une petite boucle de 100000 pour m\'amuser');
  26. $TestIf=9997;
  27. for ($i=0;$i<10000;$i++) {
  28. if ($i==$TestIf) { echo 'Condition remplie<hr />'; }
  29. }
  30. calctaf('je viens de faire une petite boucle de 10000 avec une condition pour m\'amuser');
  31. echo $totalcalculopefct;
  32. ?>


 
Voilà, des commentaires ? :D


Message édité par The-Shadow le 30-07-2005 à 00:09:11
Reply

Marsh Posté le 29-07-2005 à 19:31:35   

Reply

Marsh Posté le 29-07-2005 à 19:50:09    

Reply

Marsh Posté le 29-07-2005 à 19:56:31    

Bah, moi et l'anglais. :D

Reply

Marsh Posté le 29-07-2005 à 21:19:37    

Il y avait un bug dans la fonction que j'ai fait en corrigeant un chouillat le script avant de le poster, j'ai corrigé. :D

Reply

Marsh Posté le 29-07-2005 à 22:07:43    


y'a aussi une classe benchmark sur PEAR (au passage PEAR, j'ai toujours pas compris le principe du truc...c'est juste plein de class ?!?)
 
Sinon, ce soir, je vais tester phpcoverage (qui utilise xdebug) http://www.spikesource.com/project [...] ements.php
 
 
et pour ta variable : transforme tes fonctions & tout en objet, et tu aura plus de problème de variable avec un nom merdique


---------------
my flick r - Just Tab it !
Reply

Marsh Posté le 29-07-2005 à 22:34:15    

Comme j'ai dit, y'a surement mieux et mieux optimisé.
L'avantage de vos trucs par rapport à XDebug (par exemple), c'est que demain, j'ai un nouvel ordi, j'installe XP, DreamWeaver, Wampserver et hop, je me retrouve dans mon environnement de développement et mes routines me permettent de gérer l'optimisation n'importe où sans rien rajouter d'autres (d'ailleurs je le fais souvent quand je vais bosser sur le portable de ma femme devant la télé).
 
Zapan666 => Développe ? C'est quoi un objet ?

Reply

Marsh Posté le 29-07-2005 à 22:57:09    

The-Shadow a écrit :

Comme j'ai dit, y'a surement mieux et mieux optimisé.
L'avantage de vos trucs par rapport à XDebug (par exemple), c'est que demain, j'ai un nouvel ordi, j'installe XP, DreamWeaver, Wampserver et hop, je me retrouve dans mon environnement de développement et mes routines me permettent de gérer l'optimisation n'importe où sans rien rajouter d'autres (d'ailleurs je le fais souvent quand je vais bosser sur le portable de ma femme devant la télé).
 
Zapan666 => Développe ? C'est quoi un objet ?


mouais, bon, xdebug, je viens de l'installer, 5min top chrono avec mon 266Mhz...
 
Pour l'objet, j'ai dit une connerie, ça change rien du tout, tu aura toujours une variable qui traine, mais tu peux mettre tes fonctions dans un objet, tout de même

Code :
  1. public class BenchMark {
  2. private $debut;
  3. private $fin;
  4. private $operation;
  5. public function __toString() {
  6. return $operation." : ".$fin-$debut." microsecondes";   
  7. }
  8. public function __construct($operation) {
  9. $this->operation = $operation;
  10. }
  11. public function debut() {
  12. $this->debut=getmicrotime();
  13. }
  14. public function fin() {
  15. $this->fin=detmicrotime();
  16. }
  17. private function getmicrotime() {
  18.     $mtime = microtime();
  19.     $mtime = explode(" ",$mtime);
  20.     $mtime = $mtime[1] + $mtime[0];
  21.     return ($mtime);
  22. }
  23. }


 
et ta page de test :  

Code :
  1. $bench = new BenchMark("test !" );
  2. $bench->debut();
  3. // TON code php. blablablabalabla
  4. $bench->fin();
  5. echo $bench;


 
Bon, c'est fait à l'arrache. Je sais pas si ça marche...mais grosso modo, y'a l'idée. C'est pour PHP5 : pour PHP4, faut un peu adapter


Message édité par zapan666 le 29-07-2005 à 22:57:50

---------------
my flick r - Just Tab it !
Reply

Marsh Posté le 29-07-2005 à 23:56:00    

Concrètement, je gagne quoi à utiliser ton truc plutot que le mien, à part des lignes en plus ?

Reply

Marsh Posté le 30-07-2005 à 00:57:03    

Sympa comme idée, j'aime beaucoup :)

Reply

Marsh Posté le 30-07-2005 à 01:45:27    

Mon xDebug me génère des fichiers ouvrable sous KCacheGrind (nux) ou sur WinCacheGrind (win), ça donne ça :
 
http://img176.imageshack.us/img176/4870/xdebug8cg.png
 
 
 
En plus il fait débuggueur, par exemple en cas d'erreur, il m'affiche une jolie stacktrace :)

Reply

Marsh Posté le 30-07-2005 à 01:45:27   

Reply

Marsh Posté le 30-07-2005 à 01:46:15    

J'peut fouiller dans les méthodes, me balader partout pour contrôler le déroulement du script, vérifier ligne par ligne, etc :)

Reply

Marsh Posté le 30-07-2005 à 02:02:31    

Ouai, concrètement, c'est un débuggueur.
Avec toute la complexité qu'impose un programme du genre.
Sans possibilité de tri là où TOI tu le veux.
ça à l'air pas mal, mais je préfère ma méthode :D
Elle est tellement plus simple. :D
 
En fait, j'en utilise d'autre, j'ai aussi une fonction qui me fait mes requêtes SQL et qui les calcule ainsi que le temps qu'elles prennent, etc.
 
A l'époque où je programmais en GFA, j'avais un debuggeur, c'est lourdingue, c'est comment donner 658 informations. Résultat, on passe plus de temps à chercher l'optimisation qu'à faire du concrès, c'est comme si je voulais mettre un sapin dans mon jardin et qu'on m'amène un sapin de noël, il faudrait que je me débrouille à virer les guirlandes et les boules en trop (sans parler de la crèche :D) sans lui faire perdre les épines qui m'intéressent.
 
Bref, ta méthode est valable par rapport à la mienne, mais elles ne peuvent être comparée, la mienne est nettement plus concrète vu qu'elle ne fournit que ce que je veux. Et niveau pédagogie et simplicité, la mienne l'emporte facilement. :D
 
Cela dit, ta méthode a tout à fait sa place dans ce topic. :jap:


Message édité par The-Shadow le 30-07-2005 à 03:17:07
Reply

Marsh Posté le 30-07-2005 à 10:55:35    

Shadow, ta fonction est en effet tout bête, mais je pense qu'elle permet une très bonne optimisation.
On voit vraiment où est ce que le CPU rame le plus et on peut optimiser localement.
 
Par rapport à toutes les possibilités d'un débuggeur, je trouve la methode très bonne.
Je l'utilise depuis un peu moins d'un an.
(pas exactement la même chose, mais un truc qui ressemble bien...)
 
++

Reply

Marsh Posté le 30-07-2005 à 11:21:12    

The-Shadow a écrit :

Sans possibilité de tri là où TOI tu le veux.


Je pige pas ta phrase :( J'ai le temps d'exécution de toutes les méthodes, j'peux voyager facilement pour trouver la méthode qui m'intéresse, ou la ligne...
 
Ensuite moi je passe pas mon temps à mettre la fonction de calcul, c'est automatisé :D En fait au début j'avais un truc comme le tiens :) Mais ça devenait tellement lourdingue, que j'ai vite cherché autre chose, c'est là où je suis tombé sur xdebug ;)

Reply

Marsh Posté le 30-07-2005 à 17:22:30    

Ce que je veux dire par tri, c'est que tu as les temps de TOUT, alors qu'il y a des trucs en PHP, tu sais que le temps est ridicule et calctaf te donne que l'instant X que tu voulais.
J'ai une macro dans Dream, je tape mon commentaire, je clic sur un bouton et il me rajoute calctaf('mon texte');
J'avoue faut juste que je vérifie les apostrophes parce que j'ai eu la flemme de modifier la macro à la main. :D
Pour ce qui est du lourdingue, bah, c'est comme commenter son code, de toute façon, c'est lourdingue de mettre des commentaires partout, mais même si je n'avais pas calctaf, je le ferais pour m'y retrouver plus tard. :D

Reply

Marsh Posté le 30-07-2005 à 19:21:51    

Xdebug 2 + KCacheGrind permet en plus d'avoir une représentation visuel de tes appels. (je découvre ça au fur et à mesure la bête ! )
 
Exemple de graph à partir d'une page de mon site.


---------------
my flick r - Just Tab it !
Reply

Marsh Posté le 31-07-2005 à 17:05:24    

FlorentG tu utilises XDebug 1 ou 2 ?

Reply

Marsh Posté le 31-07-2005 à 17:53:54    

Apparament le 2 vu que WinCacheGrind marche que avec celui-ci :)

Reply

Marsh Posté le 31-07-2005 à 23:30:18    

je n'arrive pas a creer les fichier .out
j'ai mis dans le php .ini :
 
xdebug.profiler_enable 1
xdebug.profiler_output_dir F:\repertoire
 
merci

Reply

Marsh Posté le 01-08-2005 à 04:25:02    

Citation :

xdebug.profiler_enable=1
xdebug.profiler_output_dir=F:\repertoire  


me semble plus approprié
 
moi, le pb que j'ai : dès fois, il fait les .out, dès fois, il ne fait rien, et je comprend pas trop pourquoi..


Message édité par zapan666 le 01-08-2005 à 04:25:58
Reply

Marsh Posté le 01-08-2005 à 09:39:10    

zapan666 a écrit :

Xdebug 2 + KCacheGrind permet en plus d'avoir une représentation visuel de tes appels. (je découvre ça au fur et à mesure la bête ! )
 
Exemple de graph à partir d'une page de mon site.


 
Ouais :fou: Et WinCacheGrind est ultra merdique à côté de ça :cry:
 

Je@nb a écrit :

FlorentG tu utilises XDebug 1 ou 2 ?


 
Le 2 :jap:

Reply

Marsh Posté le 02-08-2005 à 13:27:28    

Je m'étais fait unssi une classe que j'utilise à l'occasion. Même principe, j'ajoute des étapes et j'affiche un tableau à la fin.
 

Code :
  1. class Mouchard
  2. {
  3. var $tabEtapes ;
  4.   function Mouchard()     // constructeur
  5.   {
  6.    $this->tabEtapes = array();
  7.    $this->ajouteEtape( 'Création du mouchard' );
  8.   }
  9.   function ajouteEtape( $string )
  10.   {
  11.    $this->tabEtapes[] = array( 'Nom' => $string , 'Date' => $this->MicrotimeToTemps( microtime() ) );
  12.   }
  13.  
  14.   function getRapport()
  15.   {
  16.    $premier = $this->tabEtapes[0];
  17.    $lastTime = $premier['Date'] ;
  18.    $str = "\n<br/>\n<br/>\n";
  19.  
  20.    foreach( $this->tabEtapes as $item )
  21.    {
  22.     $str .= $item['Nom'].' '.( $item['Date'] - $lastTime ).' sec depuis l\'étape précedente<br/>'."\n" ;
  23.     $lastTime = $item['Date'] ;
  24.    }
  25.  
  26.    $dernier = $this->MicrotimeToTemps( microtime() );
  27.    $str .= ' Temps d\'execution total relevé '.( $dernier - $premier['Date'] ).' sec <br/>'."\n" ;
  28.  
  29.    return $str;
  30.   }
  31.   function MicrotimeToTemps( $microtime )
  32.   {
  33.    $temp = explode( ' ' , $microtime );
  34.    return ( (float)$temp[0] + (float)$temp[1] );
  35.   }
  36. }


 
Mais xdebug me parait plus interessant. Faut que je vois comment ça marche. Une fois installé, ça marche tout seul et génère des logs c'est ça ?


---------------
"L'informatique n'est pas plus la science des ordinateurs que l'astronomie n'est celle des télescopes." Michael R. Fellows & Ian Parberry
Reply

Marsh Posté le 02-08-2005 à 14:40:50    

Presque. Après faut WinCacheGrind ou KCacheGrind pour exploiter les logs

Reply

Marsh Posté le    

Reply

Sujets relatifs:

Leave a Replay

Make sure you enter the(*)required information where indicate.HTML code is not allowed