PARSER DE LOG QUAKE 3, URBAN TERROR,...

cs_yoman64 Messages postés 592 Date d'inscription samedi 19 janvier 2002 Statut Membre Dernière intervention 4 décembre 2008 - 29 juil. 2008 à 03:13
Ilsundal Messages postés 79 Date d'inscription lundi 23 décembre 2002 Statut Membre Dernière intervention 1 mars 2011 - 31 juil. 2008 à 09:05
Cette discussion concerne un article du site. Pour la consulter dans son contexte d'origine, cliquez sur le lien ci-dessous.

https://codes-sources.commentcamarche.net/source/47424-parser-de-log-quake-3-urban-terror

Ilsundal Messages postés 79 Date d'inscription lundi 23 décembre 2002 Statut Membre Derniè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és 592 Date d'inscription samedi 19 janvier 2002 Statut Membre Derniè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és 592 Date d'inscription samedi 19 janvier 2002 Statut Membre Derniè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 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...
cs_yoman64 Messages postés 592 Date d'inscription samedi 19 janvier 2002 Statut Membre Derniè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.

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 :)
codefalse Messages postés 1123 Date d'inscription mardi 8 janvier 2002 Statut Modérateur Dernière intervention 21 avril 2009 1
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és 507 Date d'inscription jeudi 28 mars 2002 Statut Membre Dernière intervention 13 mai 2009 1
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és 79 Date d'inscription lundi 23 décembre 2002 Statut Membre Derniè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és 592 Date d'inscription samedi 19 janvier 2002 Statut Membre Dernière intervention 4 décembre 2008
29 juil. 2008 à 03:13
Salut,

Tu devrais sortir les count() et les sizeof() des boucles.
Rejoignez-nous