Ilsundal
Messages postés79Date d'inscriptionlundi 23 décembre 2002StatutMembreDernière intervention 1 mars 2011 31 juil. 2008 à 09:05
wouahouu, ca c'est de l'optimisation !!! Merci, je vais prendre note de tous ça.
cs_yoman64
Messages postés592Date d'inscriptionsamedi 19 janvier 2002StatutMembreDernière intervention 4 décembre 2008 30 juil. 2008 à 12:05
Bon, je suis lourd c'est vrai, mais CS a tout détruit ma belle indentation...
Voila le code plus clair: http://pastebin.org/58433
Sur ce, bonne journée à vous, et bonne nuit à moi :]
cs_yoman64
Messages postés592Date d'inscriptionsamedi 19 janvier 2002StatutMembreDernière intervention 4 décembre 2008 30 juil. 2008 à 12:02
bon comme j'avais rien à faire (enfin, si, je devrais dormir, il est 6hr du mat ^^) j'ai fait un mini exemple pour prouver ce que je dis (parce que je sais par expérience que se faire dire que son code est pourris par quelqu'un qui propose pas mieux c'est très insultant)
Voilà, on pase de 90 à 28 lignes et de 1.65secondes à 0.35 pour 100 lectures et tri de games3.log (sur mon pc)
function array_sort($array, $key) {
switch($key) {
case 'score':
arsort($array);
break;
case 'joueur':
$array = array_flip($array);
arsort($array);
$array = array_flip($array);
break;
}
return $array;
}
PS: J'ai pris 10 minutes à faire ça, il peut encore être optimisé, mais pour moi c'est l'heure de dormir ;p
PPS: Si un admin croit que je pollue le sujet, libre à lui de supprimer mon post...
cs_yoman64
Messages postés592Date d'inscriptionsamedi 19 janvier 2002StatutMembreDernière intervention 4 décembre 2008 30 juil. 2008 à 10:34
"Après, je pense que c'est surtout les habitudes de codage."
Oui, mais faut comprendre qu'il y a de meilleures habitudes que d'autre. Enfin, moi, j'ai l'habitude de chercher à faire un code optimisé avant tout. D'ailleurs je passe sans doute plus de temps à comparer/bencher des façons de faire que de coder à proprement dit, tout ça dans le but de sauver quelques cycles CPU.
Il est évident que sur ton code seul on ne ressentira pas la différence, mais quelques dix millièmes de seconde par ci par là, ça finit par donner des secondes. Et puis, le but principal d'un vrai programmeur, est d'avoir un code le plus optimisé possible. C'est sans doute la différence entre l'amateur et le vrai passionné(je ne dis pas professionnel, parce que tristement professionnel veut rarement dire compétent): Un veut simplement que ça fonctionne, l'autre veux que ça fonctionne, et que ça soit bien codé :P.
Le count, comme disait STAILER, est en effet calculer à chaque itération puisque la condition est comparé à chaque itération. Ça devient vite très lourd, surtout avec de gros tableaux. Le sortir de là va donc, forcément, sauver beaucoup de temps d'exécution.
D'ailleurs ça ne rajoute pas forcément une ligne, tu peux l'inclure dans la définition de la boucle.
D'ailleurs beaucoup d'autres choses pouraient être améliorées:
# $hFile = fopen($Fichier, "r");
# while(!feof($hFile))
# {
# $Log .= fgets($hFile);
# }
# fclose($hFile);
Pourrait utilisé file_get_contents, mais je ne comprends même pas pourquoi tu procède de cette façon, faire le traitement directement dans cette boucle serait BEAUCOUP plus rapide que de tout charger, et de le rediviser après. En fait ça permettrait de remplacer les lignes 23 à 58 par 5 ou 6 petites lignes.
Ensuite, tu sembles utiliser strstr pour savoir si une chaine est dans une autre. Si c'est le cas tu devrais utiliser strpos qui va être plus rapide pour l'usage que tu en fais.
Dans EffaceLog tu ne fermes pas le pointeur de fichier. Php le fait automatiquement à la fin du script, mais c'est une mauvaise habitude de pas fermer ses fichiers.
Voilà, garde à l'esprit que nous sommes sur codes-sources, et que tous ces commentaires ont pour but de t'aider à t'améliorer, non pas de dénigrer ton code ;p
Sinon l'idée de codefalse est intéressante, une classe serait sans doute sympatique :)
codefalse
Messages postés1123Date d'inscriptionmardi 8 janvier 2002StatutModérateurDernière intervention21 avril 20091 29 juil. 2008 à 10:02
En fait, sortir les fonctions count et sizeof des boucles permettent d'augmenter la rapidité d'éxécution de ton script. Quand tu as juste ton code ici préent qui est lancé, ce n'est pas un gros problème, mais s'il est appelé avec plusieurs autres scripts, ca va vite devenir gênant.
Sortir le maximum de fonction des boucles et une des règles de base de l'optimisation du code, chose à ne jamais négliger.
Par rapport à ton code, je l'aurai beaucoup plus apprécié en tant que classe. En effet, vu l'usage, ca aurait été sympa un truc du genre :
$obj = new GameLogParser ('./quake3.log');
echo 'Statistiques du joueur Ilsundal" :
';
echo 'Nombre de matchs gagnés :' . $obj->getWinnedMatches ('Ilsundal').'
';
...
etc :)
Voir jouer avec les méthodes magiques __get et __set, du genre $obj->Winner; te retourne le grand gagnant, à toi de voir comment tu implémente le tout ! :)
cs_stailer
Messages postés507Date d'inscriptionjeudi 28 mars 2002StatutMembreDernière intervention13 mai 20091 29 juil. 2008 à 09:57
Ca va juste te rajouter au dessus de tes boucles :
$nbTable = sizeof($Table);
for ....
Ca te fais une ligne de plus mais surtout, le total n'est pas recalculé à chaque passage. Car il me semble que c'est ce qu'il se passe si mes souvenirs sont bons...
Ilsundal
Messages postés79Date d'inscriptionlundi 23 décembre 2002StatutMembreDernière intervention 1 mars 2011 29 juil. 2008 à 09:06
Je vais défendre mon beefsteak, lol. Est-ce que le code ne vas pas être plus (trop?) chargé si je sort le sizeof() et les count() ? ou même l'exécution plus lente (à l'état atomique de la chose biensure) ?
Après, je pense que c'est surtout les habitudes de codage.
cs_yoman64
Messages postés592Date d'inscriptionsamedi 19 janvier 2002StatutMembreDernière intervention 4 décembre 2008 29 juil. 2008 à 03:13
Salut,
Tu devrais sortir les count() et les sizeof() des boucles.
31 juil. 2008 à 09:05
30 juil. 2008 à 12:05
Voila le code plus clair: http://pastebin.org/58433
Sur ce, bonne journée à vous, et bonne nuit à moi :]
30 juil. 2008 à 12:02
Voilà, on pase de 90 à 28 lignes et de 1.65secondes à 0.35 pour 100 lectures et tri de games3.log (sur mon pc)
function LireLog($Fichier) {
$hFile = fopen($Fichier, "r");
while(!feof($hFile)) {
fscanf($hFile, '%d:%d score: %d ping: %d client: %d %[^$]s',$h,$m,$score,$ping,$client,$nom);
if ($nom !== null && $score !== null){
$Stats[$nom] += $score;
$nom=null;
$score = null;
}
}
fclose($hFile);
//Retourne le tableau
return $Stats;
}
function array_sort($array, $key) {
switch($key) {
case 'score':
arsort($array);
break;
case 'joueur':
$array = array_flip($array);
arsort($array);
$array = array_flip($array);
break;
}
return $array;
}
PS: J'ai pris 10 minutes à faire ça, il peut encore être optimisé, mais pour moi c'est l'heure de dormir ;p
PPS: Si un admin croit que je pollue le sujet, libre à lui de supprimer mon post...
30 juil. 2008 à 10:34
Oui, mais faut comprendre qu'il y a de meilleures habitudes que d'autre. Enfin, moi, j'ai l'habitude de chercher à faire un code optimisé avant tout. D'ailleurs je passe sans doute plus de temps à comparer/bencher des façons de faire que de coder à proprement dit, tout ça dans le but de sauver quelques cycles CPU.
Il est évident que sur ton code seul on ne ressentira pas la différence, mais quelques dix millièmes de seconde par ci par là, ça finit par donner des secondes. Et puis, le but principal d'un vrai programmeur, est d'avoir un code le plus optimisé possible. C'est sans doute la différence entre l'amateur et le vrai passionné(je ne dis pas professionnel, parce que tristement professionnel veut rarement dire compétent): Un veut simplement que ça fonctionne, l'autre veux que ça fonctionne, et que ça soit bien codé :P.
Le count, comme disait STAILER, est en effet calculer à chaque itération puisque la condition est comparé à chaque itération. Ça devient vite très lourd, surtout avec de gros tableaux. Le sortir de là va donc, forcément, sauver beaucoup de temps d'exécution.
D'ailleurs ça ne rajoute pas forcément une ligne, tu peux l'inclure dans la définition de la boucle.
for($i=0, $j=0; $i < count($Stats); $i++)
devient
for($i=0, $j=0, $cntStats = count($Stats); $i < $cntStats; $i++)
D'ailleurs beaucoup d'autres choses pouraient être améliorées:
# $hFile = fopen($Fichier, "r");
# while(!feof($hFile))
# {
# $Log .= fgets($hFile);
# }
# fclose($hFile);
Pourrait utilisé file_get_contents, mais je ne comprends même pas pourquoi tu procède de cette façon, faire le traitement directement dans cette boucle serait BEAUCOUP plus rapide que de tout charger, et de le rediviser après. En fait ça permettrait de remplacer les lignes 23 à 58 par 5 ou 6 petites lignes.
Ensuite, tu sembles utiliser strstr pour savoir si une chaine est dans une autre. Si c'est le cas tu devrais utiliser strpos qui va être plus rapide pour l'usage que tu en fais.
Dans EffaceLog tu ne fermes pas le pointeur de fichier. Php le fait automatiquement à la fin du script, mais c'est une mauvaise habitude de pas fermer ses fichiers.
Voilà, garde à l'esprit que nous sommes sur codes-sources, et que tous ces commentaires ont pour but de t'aider à t'améliorer, non pas de dénigrer ton code ;p
Sinon l'idée de codefalse est intéressante, une classe serait sans doute sympatique :)
29 juil. 2008 à 10:02
Sortir le maximum de fonction des boucles et une des règles de base de l'optimisation du code, chose à ne jamais négliger.
Par rapport à ton code, je l'aurai beaucoup plus apprécié en tant que classe. En effet, vu l'usage, ca aurait été sympa un truc du genre :
$obj = new GameLogParser ('./quake3.log');
echo 'Statistiques du joueur Ilsundal" :
';
echo 'Nombre de matchs gagnés :' . $obj->getWinnedMatches ('Ilsundal').'
';
...
etc :)
Voir jouer avec les méthodes magiques __get et __set, du genre $obj->Winner; te retourne le grand gagnant, à toi de voir comment tu implémente le tout ! :)
29 juil. 2008 à 09:57
$nbTable = sizeof($Table);
for ....
Ca te fais une ligne de plus mais surtout, le total n'est pas recalculé à chaque passage. Car il me semble que c'est ce qu'il se passe si mes souvenirs sont bons...
29 juil. 2008 à 09:06
Après, je pense que c'est surtout les habitudes de codage.
29 juil. 2008 à 03:13
Tu devrais sortir les count() et les sizeof() des boucles.