Files
2026_TD1_DEV51_Qualite_Algo/notes.md
T

4.9 KiB

Lancement du programme après la compilation avec gcc -O0 analyseur.c -o analyseur

Lignes analysées      : 21746
Mots au total         : 250000
Mots distincts        : 5866
Longueur moyenne      : 6.712 (écart-type 1.873)
Bigramme le + courant : "me" (17607 fois, souvent suivi de 'n')

Top 10 :
   1. rane             287
   2. fasi             241
   3. tata             219
   4. mopo             214
   5. cofi             180
   6. vesi             179
   7. laganomo         177
   8. boto             172
   9. nopebo           169
  10. rotion           165

Empreinte du rapport  : 1d53de903efd2b7c

Et ensuite la commande time sur l'exécutable avec time ./analyseur

Lignes analysées      : 21746
Mots au total         : 250000
Mots distincts        : 5866
Longueur moyenne      : 6.712 (écart-type 1.873)
Bigramme le + courant : "me" (17607 fois, souvent suivi de 'n')

Top 10 :
   1. rane             287
   2. fasi             241
   3. tata             219
   4. mopo             214
   5. cofi             180
   6. vesi             179
   7. laganomo         177
   8. boto             172
   9. nopebo           169
  10. rotion           165

Empreinte du rapport  : 1d53de903efd2b7c

real    0m2.858s
user    0m2.821s
sys     0m0.013s

On recompile avec le flag -pg : gcc -O0 -pg analyseur.c -o analyseur Et on relance time dessus

Lignes analysées      : 21746
Mots au total         : 250000
Mots distincts        : 5866
Longueur moyenne      : 6.712 (écart-type 1.873)
Bigramme le + courant : "me" (17607 fois, souvent suivi de 'n')

Top 10 :
   1. rane             287
   2. fasi             241
   3. tata             219
   4. mopo             214
   5. cofi             180
   6. vesi             179
   7. laganomo         177
   8. boto             172
   9. nopebo           169
  10. rotion           165

Empreinte du rapport  : 1d53de903efd2b7c

real    0m6.354s
user    0m6.295s
sys     0m0.020s

On lance gprof : gprof -b ./analyseur gmon.out > profil_avant.txt

Optimisation de chercher_mot : recherche dichotomique

La recherche initiale parcourait toutes les entrées jusqu'à trouver le mot. Pour 150 182 recherches, elle effectuait 296 656 203 appels à egales().

Le tableau est maintenant maintenu dans l'ordre alphabétique pendant le comptage. chercher_mot utilise comparer() pour éliminer la moitié des entrées restantes à chaque étape : la recherche passe de O(n) à O(log n). Si le mot est absent, la fonction renvoie -(position d'insertion + 1) ; compter_mot retrouve cette position avec -indice - 1, décale les entrées et insère le nouveau mot. Cette insertion reste en O(n), mais elle n'a lieu qu'à la première apparition de chacun des 5 866 mots distincts. Le tableau existant est réutilisé, sans allocation supplémentaire. Le tri final par fréquence produit le même classement.

Résultats du nouveau profil, conservé dans out/profil_apres.txt :

Mesure Avant Après
Appels de chercher_mot 150 182 150 182
Appels à egales() depuis chercher_mot 296 656 203 0
Comparaisons de chaînes dans chercher_mot 296 656 203 1 718 447
Appels à egales() dans tout le programme 308 701 874 12 045 671
Temps réel sans profiling (gcc -O0) 2,80 s 1,45 s

Les recherches effectuent environ 173 fois moins de comparaisons. Les appels restants à egales() viennent de est_mot_vide. Les temps ci-dessus correspondent à une mesure avant/après sur la même machine pendant cette modification : environ 48 % de temps en moins (accélération d'environ 1,93). Ce sont des mesures ponctuelles.

Validation : compilation avec -Wall -Wextra -Wpedantic, rapport et sortie console identiques octet par octet à la version initiale, avec et sans -pg. L'empreinte reste 1d53de903efd2b7c. Un test temporaire sous AddressSanitizer et UndefinedBehaviorSanitizer a également vérifié les recherches dans un tableau vide, les mots présents ou absents, les insertions au début/milieu/fin, les doublons et les mots de 31 caractères, puis comparé 10 000 comptages à une référence linéaire.

Pour reproduire le profil sans écraser les fichiers du profil initial :

mkdir -p out/apres
gcc -O0 -pg analyseur.c -o out/apres/analyseur
(cd out/apres && ./analyseur && gprof -b ./analyseur gmon.out > ../profil_apres.txt)
Lignes analysées      : 21746
Mots au total         : 250000
Mots distincts        : 5866
Longueur moyenne      : 6.712 (écart-type 1.873)
Bigramme le + courant : "me" (17607 fois, souvent suivi de 'n')

Top 10 :
   1. rane             287
   2. fasi             241
   3. tata             219
   4. mopo             214
   5. cofi             180
   6. vesi             179
   7. laganomo         177
   8. boto             172
   9. nopebo           169
  10. rotion           165

Empreinte du rapport  : 1d53de903efd2b7c

real    0m1.986s
user    0m1.934s
sys     0m0.011s