Forum |  HardWare.fr | News | Articles | PC | S'identifier | S'inscrire | Shop Recherche
2991 connectés 

  FORUM HardWare.fr
  Programmation
  PHP

  Optimisation de scripts PHP, comment la calculer.

 


 Mot :   Pseudo :  
 
Bas de page
Auteur Sujet :

Optimisation de scripts PHP, comment la calculer.

n°1165217
The-Shadow
Développeur
T'as été voir dans ton profil?
Posté le 29-07-2005 à 19:31:35  profilanswer
 

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
mood
Publicité
Posté le 29-07-2005 à 19:31:35  profilanswer
 

n°1165230
FlorentG
Unité de Masse
Posté le 29-07-2005 à 19:50:09  profilanswer
 
n°1165235
The-Shadow
Développeur
T'as été voir dans ton profil?
Posté le 29-07-2005 à 19:56:31  profilanswer
 

Bah, moi et l'anglais. :D

n°1165268
The-Shadow
Développeur
T'as été voir dans ton profil?
Posté le 29-07-2005 à 21:19:37  profilanswer
 

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

n°1165285
zapan666
Tout est relatif
Posté le 29-07-2005 à 22:07:43  profilanswer
 


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 !
n°1165295
The-Shadow
Développeur
T'as été voir dans ton profil?
Posté le 29-07-2005 à 22:34:15  profilanswer
 

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 ?

n°1165305
zapan666
Tout est relatif
Posté le 29-07-2005 à 22:57:09  profilanswer
 

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 !
n°1165323
The-Shadow
Développeur
T'as été voir dans ton profil?
Posté le 29-07-2005 à 23:56:00  profilanswer
 

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

n°1165345
mrbebert
Posté le 30-07-2005 à 00:57:03  profilanswer
 

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

n°1165362
FlorentG
Unité de Masse
Posté le 30-07-2005 à 01:45:27  profilanswer
 

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

mood
Publicité
Posté le 30-07-2005 à 01:45:27  profilanswer
 

n°1165363
FlorentG
Unité de Masse
Posté le 30-07-2005 à 01:46:15  profilanswer
 

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

n°1165370
The-Shadow
Développeur
T'as été voir dans ton profil?
Posté le 30-07-2005 à 02:02:31  profilanswer
 

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
n°1165435
Malta
Posté le 30-07-2005 à 10:55:35  profilanswer
 

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...)
 
++

n°1165443
FlorentG
Unité de Masse
Posté le 30-07-2005 à 11:21:12  profilanswer
 

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

n°1165599
The-Shadow
Développeur
T'as été voir dans ton profil?
Posté le 30-07-2005 à 17:22:30  profilanswer
 

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

n°1165690
zapan666
Tout est relatif
Posté le 30-07-2005 à 19:21:51  profilanswer
 

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 !
n°1166094
Je@nb
Kindly give dime
Posté le 31-07-2005 à 17:05:24  profilanswer
 

FlorentG tu utilises XDebug 1 ou 2 ?

n°1166114
Je@nb
Kindly give dime
Posté le 31-07-2005 à 17:53:54  profilanswer
 

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

n°1166219
shrd
Posté le 31-07-2005 à 23:30:18  profilanswer
 

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

n°1166333
zapan666
Tout est relatif
Posté le 01-08-2005 à 04:25:02  profilanswer
 

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
n°1166364
FlorentG
Unité de Masse
Posté le 01-08-2005 à 09:39:10  profilanswer
 

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:

n°1167824
Ricco
Retour au pays
Posté le 02-08-2005 à 13:27:28  profilanswer
 

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
n°1167891
FlorentG
Unité de Masse
Posté le 02-08-2005 à 14:40:50  profilanswer
 

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

mood
Publicité
Posté le   profilanswer
 


Aller à :
Ajouter une réponse
  FORUM HardWare.fr
  Programmation
  PHP

  Optimisation de scripts PHP, comment la calculer.

 

Sujets relatifs
Récupérer un nom de fichier (sans l'extension) en Php[PHP - MySQL] Récupérer choix d'un "enum" dans BDD
[EMPLOI] Recherche Programmeur PHP / GraphistePb Php/sql, gestion d'une liste dynamique
[PHP/mySQL] conseils d'optimisationModifier un fichier PDF avec PHP
exécution automatique et quotidienne de scripts phpAide pour amelioration script PHP
[prog PHP][resolu] Faire un PHP qui archive un site 
Plus de sujets relatifs à : Optimisation de scripts PHP, comment la calculer.


Copyright © 1997-2022 Hardware.fr SARL (Signaler un contenu illicite / Données personnelles) / Groupe LDLC / Shop HFR