|
Publicité ' | ||||||||||||||||||||||||
|
|
#1 | ||||
|
Nouveau Membre du Club
![]() Inscription : décembre 2003 Messages : 223 ![]() |
Salut a tous !
Alors, voici ma situation : j'ai une fonction qui me retourne le resultat d'une requete dans un tableau associatif, dont les clés sont les champs de ma table ... J'ai ensuite d'autres fonctions qui font un traitement sur ce tableau ... Dans un certains cas, mon tableau contient 20 clés pour 10912 valeurs par clé. Le probleme, c que pour ce cas, mon script est beaucoup trop long. En faisant une fonction de test, qui se place dans mon cas : Code :
Code :
Je fais un die juste apres la fonction testBoucle, mon script met 41 sec a s'executer ... Pensez vous que c normal, et auriez vous des idées d'optimisation ? Merci bien pour votre aide ! @+. |
||||
|
|
00
|
|
|
#2 | ||
|
Nouveau Membre du Club
![]() Inscription : décembre 2003 Messages : 223 ![]() |
en passant directement par le tableau dans ma fonction testBoucle en faisant :
Code :
|
||
|
|
00
|
|
|
#3 |
|
Membre émérite
![]() Inscription : février 2006 Messages : 840 ![]() |
Je ne pige pas trop ce que tu cherches à faire, mais avec tes trois boucles imbriquées tu arrives à 2 182 400 itérations en 41 secondes, ce qui fait 53230 itérations à la seconde. Pas mal comme rendement.
A mon avis il faut que tu revois ta procédure. Ce nombre 10912 il sort d'où ?
__________________
Consultant idéaliste. |
|
|
00
|
|
|
#4 | |||||
|
Nouveau Membre du Club
![]() Inscription : décembre 2003 Messages : 223 ![]() |
Citation:
La fonction qui l'execute me renvoi un tableau du style : Code :
Ensuite, ce que j'essaye de faire, c travailler sur ce tableau pour generer un tableau HTML avec des rowspan ... Donc, pour chaque ligne de mon tableau, pour chaque colone, je cherche le nombre de repetition de la valeut en cours ... D'ou mes 3 boucles ... En n'utilisant pas mon tableau dans la fonction de test, donc en faisant ceci : Code :
je vois pas trop pourquoi ca prends 40sec de plus en faisant : Code :
[$machin=$aPhp_ResultSql['Schema_Name'][$i]; |
|||||
|
|
00
|
|
|
#5 |
|
Membre émérite
![]() Inscription : février 2006 Messages : 840 ![]() |
Je ne sais pas si c'est à destination d'utilisateur, mais même 10 secondes c'est énorme.
__________________
Consultant idéaliste. |
|
|
00
|
|
|
#6 |
|
Nouveau Membre du Club
![]() Inscription : décembre 2003 Messages : 223 ![]() |
c a destination d'utilisateur, et oui 10 sec c deja enorme !
C'est pour ca qu'il faut optimiser, bon la faut dire que la requete renvoit enormement de lignes ... D'habitude, elle renvoie pas plus de 1000 lignes ... Je vais peut etre devoir changer d'algo ... |
|
|
00
|
|
|
#7 |
|
Nouveau Membre du Club
![]() Inscription : décembre 2003 Messages : 223 ![]() |
Salut !
C'est bete, parce que ya vraiment un seul cas ou ma requete me renvoit un tableau aussi enorme ... Si je divise ce tableau, en 2 ou en 3, vous pensez que le temps d'execution sera reduit ?? Merci ! @+. |
|
|
00
|
|
|
#8 | ||
|
Membre éclairé
![]() Inscription : août 2005 Messages : 361 ![]() |
Code :
a quoi sert ta boucle k???? ne peux tu utiliser array_walk plutot qu'un for? passer par des variables intermediaires bouffe pe ta memoire. par contre en fin de boucle tes string doivent etre assez long, et cela ralentit eventuellement l'execution... juste qq idée a tester ;-) si tu doit mettre tes donnée ds un tableau tu peu penser a des methodes alternative imaginons une ligne d'un tableau(apres un serialize) 12;12;15;17;16;13 tu fait un ereg replace des ; par et tu obtiend deja : 12</td><td>12</td><td>15</td><td>17</td><td>16</td><td>13
__________________
Le but de tout developpeur OO est de devenir une référence. Mon avatar est un ambigramme, les curieux peuvent le retourner ;-) Aider <> Faire a la place de!!! |
||
|
|
00
|
|
|
#9 | ||
|
Nouveau Membre du Club
![]() Inscription : décembre 2003 Messages : 223 ![]() |
ma fonction de test, c ca maintenant :
Code :
Ca, ca met 21 sec ... enorme ! Mais en meme temps pas tres etonnant vu le nombre d'iterations ... Ma boucle k sert a determiner le nombre de repetition d'une valeur pour une ligne/col ... (dans mon vrai script). Merci en tout cas ! @+. |
||
|
|
00
|
|
|
#10 |
![]() ![]() Guillaume RossoliniDirecteur technique Inscription : février 2004 Messages : 13 720 ![]() |
Salut
C'est peut-être dans ce genre de situations que l'on peut gratter quelques secondes en changeant $i++ par ++$i...
__________________
Mes articles - Zend Certified Engineer (PHP + Zend Framework) Ressources PHP - Ressources Zend Framework |
|
|
00
|
|
|
#11 |
|
Membre éclairé
![]() Inscription : août 2005 Messages : 361 ![]() |
file ton vrai script si tu veux qu'on optimise...
que peut on faire avec ca: function testBoucles($aPhp_ResultSql) { //echo "<pre align=left>aPhp_ResultSql: <br>";print_r($aPhp_ResultSql);echo "</pre>"; for($i=0;$i<10912;$i++) { for($j=0;$j<20;$j++) { for ($k=0;$k<10;$k++) { $a=getArraySqlValue($aPhp_ResultSql,$i,$j); } } } //echo $a; } ? moi si tu me file ca a optimiser je te rend ca : function testBoucles($aPhp_ResultSql) { print_r($aPhp_ResultSql)."</pre>"; for($i=0;$i<10912;$i++) for($j=0;$j<20;$a=getArraySqlValue($aPhp_ResultSql,$i,$j++)) }
__________________
Le but de tout developpeur OO est de devenir une référence. Mon avatar est un ambigramme, les curieux peuvent le retourner ;-) Aider <> Faire a la place de!!! |
|
|
00
|
|
|
#12 |
![]() ![]() Guillaume RossoliniDirecteur technique Inscription : février 2004 Messages : 13 720 ![]() |
XtofRoland : Ce n'est pas de l'optimisation, c'est de l'obfuscation de code :/
Tu concatènes avec print_r() ? Pourrais-tu réutiliser la balise code, je te prie ? C'est tellement plus lisible avec... Merci !
__________________
Mes articles - Zend Certified Engineer (PHP + Zend Framework) Ressources PHP - Ressources Zend Framework |
|
|
00
|
|
|
#13 | ||
|
Nouveau Membre du Club
![]() Inscription : décembre 2003 Messages : 223 ![]() |
voici, j'ai mis le minimul qui fait deja tout ramer ...
Code :
|
||
|
|
00
|
|
|
#14 |
|
Nouveau Membre du Club
![]() Inscription : décembre 2003 Messages : 223 ![]() |
m'enfin meme la je vois pas trop quoi optimiser ... mis a part en changeant d'algo et encore ...
|
|
|
00
|
|
|
#15 |
|
Nouveau Membre du Club
![]() Inscription : décembre 2003 Messages : 223 ![]() |
Le probleme, c que j'ai besoin de la 3è boucle !
Je vois pas trop comment faire autrement ... Et si je divisais le tableau sur lequel je boucle en plusieurs parties lorsqu'il est enorme comme ca ?? |
|
|
00
|
|
|
#16 |
|
Expert Confirmé Sénior
![]() Inscription : septembre 2004 Messages : 5 421 ![]() |
Tu affiches un tableau html de 10000 lignes ?
|
|
|
00
|
|
|
#17 |
|
Nouveau Membre du Club
![]() Inscription : décembre 2003 Messages : 223 ![]() |
Au depart, j'ai un tableau generé par une requete, de 20 colonnes pour 10912 lignes...
Je boucle dessus, pour en faire un tableau PHP ($tabPhp) qui servira pour l'affichage ... ensuite, je boucle sur $tabPhp pour afficher les lignes et les cellules de mon tableau HTML. Donc oui, j'affiche un tableau HTML de 10 000 lignes ... |
|
|
00
|
|
|
#18 | ||
|
Expert Confirmé Sénior
![]() Inscription : septembre 2004 Messages : 5 421 ![]() |
Est-ce que tu penses que l'utilisateur a vraiment besoin d'avoir 10000 lignes d'un coup ?
Pourquoi n'utiliserais-tu pas la pagination, à savoir n'afficher que 10 résultats par page comme le fait google par exemple. Je sais que ca ne résoud pas directement tes problèmes de performances, mais c'est un moyen de contournement qui a objectivement toute son utilité. Ensuite, es-tu sur que c'est ton code php qui plombe les performances et pas la requête sql ? Est ce que tu as utilisé l'exemple de la page http://php.net/microtime pour voir quel partie de ton code prenait le plus de temps ? Exemple: Code :
|
||
|
|
00
|
|
|
#19 | |||
|
Nouveau Membre du Club
![]() Inscription : décembre 2003 Messages : 223 ![]() |
Citation:
Code :
Pour la pagination, c'est une bonne idée ... mais ca ca concerne l'affichage ... il faudrait deja que j'optimise le temps d'execution du traitement ! |
|||
|
|
00
|
|
|
#20 |
|
Expert Confirmé Sénior
![]() Inscription : septembre 2004 Messages : 5 421 ![]() |
Ben pas forcément, si tu ne récupères que 10 éléments de ta bd (grace à LIMIT sous mysql par exemple), ca ira forcément plus vite, affichage ou pas.
|
|
|
00
|
Copyright © 2000-2012 - www.developpez.com