Ok j'avais pas vu ca comme ca mais ca peut etre intéressant :D
Version imprimable
Ok j'avais pas vu ca comme ca mais ca peut etre intéressant :D
Oui mais il n'y a quasiment aucune différence. Le manuel le rapelle bien, la fonction mysql_fetch_array est aussi rapide que mysql_fetch_row (mtsql_fetch_row est un cas particulier de mysql_fetch_array avec result_type à MYSQL_NUM).Citation:
Envoyé par Dozer
Pendant mes longues heures sans internet, j'ai créé un bench :)
http://iubito.developpez.com/php/bench.php
Au programme :
- Guillemets et apostrophes dans les chaînes
- while (list($key,$value) = each($array)) ou foreach ?
- $array['key'] - $array[key]
- str_replace : plusieurs appels ou avec des tableaux ?
- Application 1 : enlever les accents
- file_exists ou is_file ?
et possibilité de voir la source du bench.php, faites un copier/coller et testez sur votre ordi pour voir si les résultats correspondent aux miens. Vous aurez pas forcément la même vitesse de calcul, mais vous devez normalement arriver aux même conclusions que moi ("untel + rapide que l'autre"...)
Perso ma config est un AMD XP2400+ avec 1Go de RAM donc ça trace pas trop mal :)
Youpi! C'est vraiment génial ^^
Beaucoup de choses étaient prévisibles mais ton bench permet de voir dans quelle mesure cela influence sur les performances.
Je me posais aussi des questions sur le foreach ou while et bien la j'ai la réponse :D
merci!
Si vous avez d'autres choses à tester dites-le moi, j'ai construit ce bench en relisant mes fonctions de mon projet, pour optimiser le bazar...
Au fait une question. Quand on utilise while avec un mysql_fetch_* :
while( $row = mysql_fetch_array($result_BDD) )
c'est pas la peine de mettre de each? Le mysql_fetch_array s'occupe du pointage?
en fait il faut bien différencier le while et le foreach.
Tu peux faire un foreach sur un tableau ou sur quelque chose dont tu connais la longueur.
L'algo est :
Le while execute tant qu'une condition est remplie.Code:
1
2
3 POUR CHAQUE ELEMENT du tableau ...instructions... FIN POUR CHAQUE
while(true) boucle à l'infini puisque true (vrai) est toujours vrai.
Donc un while(mysql_fetch_*), il faut regarder que mysql_fetch_* renvoie quelque chose, ou renvoie null quand il n'a plus rien à renvoyer.
L'algo est :
Le fetch renvoie les lignes une à une donc tu ne sais pas au début combien il y a de lignes.Code:
1
2
3 TANT QUE mysql_fetch_ renvoie quelque chose (!= null) ...instructions... FIN TANT QUE
Tu peux faire un mysql_numrows pour avoir le nombre de résultat, mais un foreach ne marche pas puisque tu connais uniquement le nombre, tu n'a pas récupéré les infos.
voila je fais un peu de pub mais j'ai realisé quelques tests sur certaines fonctions, notamment la lecture de fichier en local et a distance et le parcours de tableaux.
d'autres tests sont en cours de realisation, mais si deja il y en a que cela peut interesser ...
http://www.phplibrairies.com/index.p...1&tutorial=147
simplement, à chaque itération de la boucle, il doit tester la condition, donc re-calculer à chaque fois la taille du tableau. La suggestion est de ne le calculer qu'une seule fois et stoquer le résultat dans une variable. Ainsi on sait à quoi comparer à chaque fois, sans recompter le nombre d'éléments par sizeofCitation:
Envoyé par iubito
Un truck aussi, faut essayer de rapprocher le plus possible le mysql_connect du mysql_close.
Moi par exemple, ca se connecte au debut puis ca se ferme avant d'envoyer du html (dans h_page.php)
Est-ce que la fonction mysql_close() est vraiment utile ?
Ca a un INpact sur la vitesse d'execution ? Sur la sécurité ?
melmel
De toute façon dès que ta page php est exécutée entièrement, les connexion sont fermées (équivalent à mysql_close).
:arrow: donc vitesse ça change rien
:arrow: sécurité je pense pas...
:arrow: par contre une connexion à mysql (c'est une ressource) prend de la place en mémoire. Faire un mysql_close libère donc de la mémoire.
A noter que PHP dispose d'un garbage collector.
+ d'infos sur les ressources ici : http://fr.php.net/manual/fr/language.types.resource.php
C'est du même ordre que le mysql_free_result après un mysql_query (voir ici).
Pour écrire en plus propre encore le
on peut faireCode:for($i=0;$i<sizeof($arr);$i++)
tout en une ligne ! :) optimisé niveau vitesseCode:for($i=0,$j=sizeof($arr); $i<$j; $i++)
Sinon, ya la mise en cache qui peut etre interresante :
http://www.idfr.net/etude_apache/fr/caching_opcodes.php
Enfin, pour MySQL ça change rien...
Je crois qu'on s'est un peu egarer par rapport a la question posé de depart
Pour te repondre j'ai mis dans un while un msql_fetch_row($sql) et ca marche tres bien j'ai fait un menu deroulant un tableau plein d'autres encore vraiment ca marche pas de souci
Ce code fonctionne a merveille si bien sur tu a plusieur champs dans ta baseCode:
1
2
3
4 while( $row = mysql_fetch_row($sql)) { echo"<tr><td>$row[0]</td></tr>\n<tr><td>$row[1]</td></tr>"; }
Pense que le premier champs de ta base est toujours 0
voila n'hesite pas a me contacter pour de futures questions
emrys, il a déjà été dit que mysql_fetch_array n'est pas plus lent que mysql_fetch_row et ajoute un confort d'utilisation.
Aller, un petit coup d'optimisation comme on en a parlé dans ce topic :
=>Code:
1
2
3
4 while( $row = mysql_fetch_row($sql)) { echo"<tr><td>$row[0]</td></tr>\n<tr><td>$row[1]</td></tr>"; }
Au quel cas, faire un tableau avec une cellule par ligne, c'est pas terrible, vaut mieux faire des listes <ol> ou <ul>, avec du style ;)Code:
1
2
3
4
5 while( $row = mysql_fetch_row($sql)) { echo '<tr><td>'. $row[0] .'</td></tr> <tr><td>'. $row[1] .'</td></tr>'; }
Bonjour,
Voilà, depuis très longtemps je me pose de grosses questions sur l'optimisation du php mais j'ai souvent du mal à trouver des réponses.
Alors déjà, question générale : comment faire pour tester efficacement un script ou carrément l'éxécution d'une fonction, j'ai bien un script qui calcule le nombre de milisecondes entre le début et la fin mais ca donne des chose assez différentes à chaque fois (forcément vu l'unité de temps) : est-ce qu'il faut multiplier l'éxécution et faire une moyenne, ou y-a-t-il des outils ?
En attendant de savoir faire, est-ce que quelqu'un aurait des réponses aux questions suivantes :
1- le fait de faire des fonctions imbriquées les unes dans les autres et de les appeler est-il beaucoup plus long que d'exécuter le script en bloc tel quel (parce que c'est quand même bien pratique pour la lisibilité) ?
2- lorsqu'on appelle dans une page php un grand nombre de fonctions mais de façon variable, vaut-il mieux les mettre toutes dans un seul fichier B, faire l'include une seule fois quite à ne pas servir de la moitié des fonctions ou vaut-il mieux mettre les fonctions dans des fichiers différents et ne charger chaque fichier que si on en a besoin mais donc faire plus d'includes et même beaucoup ?
Bon je crois que c'est tout pour commencer :)
Merci d'avance !
Oui, multiplie, par 100, 1000, 10000, 1 million si il faut, y'a toujours des petites variations, mais ça donne une idée. Si tu as 2 possibilités d'implémentation d'un algo, ça te permet de comparer.Citation:
Envoyé par erzebet
fonctions = + lisible, + souple (tu modifie un truc ça le modifie pour toutes les utilisations que tu vas faire.Citation:
En attendant de savoir faire, est-ce que quelqu'un aurait des réponses aux questions suivantes :
1- le fait de faire des fonctions imbriquées les unes dans les autres et de les appeler est-il beaucoup plus long que d'exécuter le script en bloc tel quel (parce que c'est quand même bien pratique pour la lisibilité) ?
Au niveau mémoire, la fonction va prendre l'espace mémoire nécessaire juste le moment de son exécution, puis le libère en sortant.
ça ne fait pas ralentir de créer des fonctions.
Tout dépend, c plus une question de lisibilité je pense.Citation:
2- lorsqu'on appelle dans une page php un grand nombre de fonctions mais de façon variable, vaut-il mieux les mettre toutes dans un seul fichier B, faire l'include une seule fois quite à ne pas servir de la moitié des fonctions ou vaut-il mieux mettre les fonctions dans des fichiers différents et ne charger chaque fichier que si on en a besoin mais donc faire plus d'includes et même beaucoup ?
Si tu as une série de fonctions pour faire le café, et une autre grosse série pour servir une bière fraîche, c + propre de séparer dans 2 fichiers.
D'un autre côté, un seul fichier pour les fonctions c + facile à inclure.
A moins que je me trompe, avoir un include avec beaucoup de fonctions dont pleins qui ne vont pas servir, ça va pas bouffer de la mémoire pour rien.
A confirmer quand même, doit y avoir un 'tit chouilla de mémoire utiliser pour "déclarer" toutes les fonctions, y compris les non-utilisées, mais ça doit pas être énorme.
au niveau de l'appel des fonctions de façon générale, appeler une fonction prend quand même un peu de proc, mais rien de comparable aux gains de lisibilité
(appel d'une fonction =
+ empilement de l'adresse de retour
+ saut au début de la fonction
<exécution de la fonction>
+ récup de l'adresse de retour sur la pile
+ saut à cette adresse
soit 4 instructions en plus : négligeable)
Merci beaucoup de vos réponses.
En gros d'après ce que vous me dites, quelles que soient les solutions que je choisis pour ces différents problèmes, les écarts d'efficacité ne seront pas significatifs donc, même si apparemment il vaut mieux en gros faire le moins d'include possible mais que c'est pas si grave que ça, après c'est une question de confort de lisibilité, c'est bien ça ?
lisibilité et réutilisation :)
Si tu as 2 algos quasi identiques (juste un chiffre qui change ou un truc dans le style), tu fais une fonction avec un paramètre.
Le jour où tu change ton algo, tu le fais qu'à un seul endroit.
pour moi le seul moment où la lisibilité doit être sacrifiée pour la puissance, c'est que ton serveur est à genoux où que tu as du code qu'il est vraiment capital d'exécuter à toute vitesse, ce qui est plutôt rare en PHP...
Ah oui quand même :))
Je pensais que la lisibilité devait être sacrifiée plus que ça au profit de la puissance moi. Bon ben c'est bien tout ça.
j'ai une autre colle : quelle expression est-elle plus rapide :
OUCode:
1
2
3
4
5
6 if($toto==0) { if($tata==0) else } else
Merci d'avance.Code:
1
2
3 if($toto==0 && tata==0) else if($toto==0 && tata!=0) else
la première, mais là encore ce n'est qu'une histoire d'une ou deux instructions.
m@ > pour faire comprendre, ça serait bien de justifier :PCitation:
Envoyé par m@
C'est la première car il ne teste qu'une fois si $toto == 0, et qu'un test sur $tata.
Dans la 2e, il teste une fois $toto et $tata, puis une autre fois $toto et $tata.
iubito >> c'est promis je le referai plus...
il y a 3 cas de figure (le test après && n'est pas effectué si le premier est faux)
si toto = 0 et tata = 0
1 : test toto, test tata, code
2 : test toto, test tata, code (ici on gagne même une instrruction (JMP))
si toto = 0 et tata != 0
1 : test toto, test tata, code
2 : test toto, test tata, test toto, test tata, code
si toto != 0
1 : test toto, code
2 : test toto, test toto, code
1 est donc mieux ou quasiment équivalent dans tous les cas de figure
Merci encore, pour vous récompenser j'en ai une autre :) :
Est-ce qu'il vaut mieux écrire :
OUCode:
1
2 $bebete='toto'.$tata.'tutu'; $GLOBALS[$bebete]
dans le cas ou la $GLOBALS en question est appelée plusieurs fois ? Autrement est-ce que la concaténation prend plus de temps à être exécutée que de rajouter une variable ? C'est quoi le mieux ?Code:$GLOBALS['toto'.$tata.'tutu']
Merci d'avance encore.
A+
le mieux c de créer une variable je pense.
1) ça fait une seule fois la concaténation (elle paraît simple comme ça, mais c tout de même une opération sur une chaine de caractères)
2) ça évite les erreurs.
Et quand t'as plus besoin de ta bébête, tu fais unLe unset c'est pour supprimer une variable (= récupérer la mémoire). Sur une chaine ou un entier, c'est rien, mais prendre l'habitude de le faire quand on utilise une variable temporaire c'est bien, car on y pense quand les variables temporaires sont plus grosses (objet, tableau...).Code:unset($bebete);
salut,
le mysql_close(); à la fin de son code mysql est il vraiment nécessaire ?
normalement non, php ferme tout seul, mais je préfère fermer mysql juste après ma dernière utilisation. Comme ça si y'a du traitement PHP un peu long après la dernière utilisation de MySQL, il ne bloque pas une connexion à la base de données.Citation:
Envoyé par Darkblast
Pour libérer de la mémoire, il faut bien utiliser des mysql_free_results ou dans le genre.
mais par contre ce n'est pas valable pour les conections persistantes, si ? (pas taper, erzebet n'a peut-être rien compris :) ).
c pas un truc mysql_pclose pour une connexion persistante.
Mais bon, recherche sur le forum, y'a eu des débat connexion persistante ou non. Perso je suis contre, à moins d'avoir comme en java la possibilité d'avoir un spool de connexion toujours instancié et que n'importe quelle classe fait appel, mais en php j'pens epas que c possible.
oui alors euh oui moi j'ai pas tout compris là :)
En fait j'utilise des connexions persistantes uniquement pour un truc que je développe actuellement et qui n'est utilisable que sur un serveur local : ca me permet de controler le nombre d'utilisateurs connectés à la base et donc au programme.
Sinon je ne les utilise jamais mais je pourrais pas dire que c'est pour les mêmes raisons que toi parce que j'ai pas compris :) mais j'irai voir sur le forum pour comprendre. Merci en tous cas.
Et donc la fonction dont tu parles en fait, elle fait le même effet que la fin de d'un script php, comme pour une connexion normale ?
pour la fonction... le réflexe doc PHP (ça aussi c'est de l'optimisation, ça évite de poser une question :mrgreen: ) http://fr.php.net/NOM_DE_LA_FONCTIONCitation:
Envoyé par erzebet
http://fr.php.net/mysql
http://fr.php.net/mysql_pclose
et là tu verras si y'a quelque chose (j'ai pas testé les URL).
tout a fait, d'ailleurs pclose n'existe pas :)
je verrai pour ça c'est pas urgent façon.
J'ai une autre question : est-il plus long d'utiliser $GLOBALS['toto'] que $toto ?
Merci d'avance.
Et pourquoi tu ne demanderais pas au systeme?Citation:
Envoyé par erzebet
Aller un coup de main : pour récupérer l'heure courante
http://fr3.php.net/manual/fr/function.microtime.php
Tu recupere avant, tu execute un script 1000 fois dans une boucle, et tu recupere apres, tu soustrais.
Même chose avec l'autre script, et tu regarde le plus rapide. A faire bien sur plusieurs fois, chez toi et en n'ayant rien qui tourne qui pourrait fausser le test.
fait des tests comme sur mon bench, tu peux t'inspirer du code, même si il est un peu fouilli.
Quand tu auras un test, balance-le code et je le mettrai dans le bench.
Bon ben moi j'arrive comme un ch'veux sur la soupe avec pas mal de journée de retard mais j'ai une question :
Pourquoi vous n'utilisai que des echo et jamais des print? :roll:
Ca peut paraitre stupide mais si echo et plus performent que le print je prefeere tous changer maintenant plutot que tout a la fin de mon projet.
en fait, je pense que c'est principalement pour des questions de lisibilités et de possibilités :
http://fr.php.net/print
http://fr.php.net/echo
comme tu peux le voir, echo offre plus de possibilitées au niveau de la sythaxe, notamment, se débarasser des parenthèses, here doc, [etc...]