Commit Graph

11 Commits

Author SHA1 Message Date
Ryad Mehiri 484c2749d8 Profil après optimisation et compte rendu du TD1
profil_apres.txt : profil gprof de la version finale (0,32 s profilées
contre 28,87 s). COMPTE_RENDU.md : temps avant/après, analyse du profil,
pistes classées par gain attendu, optimisations réalisées et gains
mesurés (6,25 s → 0,18 s en -O0, 1,72 s → 0,11 s en -O2, empreinte
inchangée).

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-14 14:06:17 +02:00
Ryad Mehiri 872935c3a2 Filtrer les mots vides sur la première lettre avant de comparer
est_mot_vide appelait egales sur les 60 mots vides pour chacun des
250 000 mots : 12 millions d'appels. On ne fait la comparaison complète
que si la première lettre correspond (873 000 appels à egales au total).

Temps : 0,20 s → 0,15 s (médiane, bruit de mesure de l'ordre de 0,05 s).
Empreinte inchangée (1d53de903efd2b7c).

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-14 14:01:55 +02:00
Ryad Mehiri f6d43c1292 Remplacer le tri à bulles par qsort
Le tri à bulles faisait n(n-1)/2 = 17,2 millions de comparaisons pour
5 866 mots. qsort trie en O(n log n) avec une fonction de comparaison
équivalente (occurrences décroissantes, puis ordre alphabétique). Les
mots étant tous distincts, l'ordre est total : le résultat est le même
malgré un tri non stable.

Temps : 0,53 s → 0,20 s. Empreinte inchangée (1d53de903efd2b7c).

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-14 14:01:14 +02:00
Ryad Mehiri 9966c6feca Ne plus recalculer la longueur de la ligne dans normaliser_ligne
La condition de boucle appelait longueur(ligne) à chaque caractère : 1,56
million de parcours de lignes d'environ 71 caractères. On s'arrête sur le
'\0', ce qui revient au même puisque la normalisation ne raccourcit pas
la ligne.

Temps : 1,06 s → 0,53 s. Empreinte inchangée (1d53de903efd2b7c).

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-14 14:00:39 +02:00
Ryad Mehiri cd34f39535 Construire le rapport en temps linéaire
ajouter() recalculait la longueur du rapport à chaque ligne : 5 867
parcours d'une chaîne qui grandit jusqu'à ~90 Ko (O(n²) en caractères).
On garde un pointeur sur la fin du rapport et on écrit directement à la
suite avec sprintf.

gprof n'attribuait que 0,04 s à construire_rapport, car il répartit le
temps de longueur() au prorata du nombre d'appels : la mesure montre que
c'était en réalité le premier poste restant.

Temps : 2,0 s → 1,06 s. Empreinte inchangée (1d53de903efd2b7c).

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-14 14:00:02 +02:00
Ryad Mehiri 255a73982c Indexer les mots par une table de hachage dans compter_mot
chercher_mot parcourait toute la table pour chaque mot : 296,7 millions
d'appels à egales pour 150 182 mots. Une table de hachage à adressage
ouvert (hachage FNV-1a, la fonction empreinte déjà présente) donne une
recherche en temps constant en moyenne. L'ordre d'insertion dans la table
est conservé.

Temps : 5,6 s → 2,0 s. Empreinte inchangée (1d53de903efd2b7c).

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-14 13:59:34 +02:00
Ryad Mehiri 330254a918 Calculer la moyenne une seule fois dans ecart_type_longueur
longueur_moyenne était rappelée à chaque tour de boucle : n appels qui
parcourent chacun toute la table, soit 34,4 millions d'appels à longueur
pour 5 866 mots (O(n²) → O(n)).

Temps : 7,6 s → 5,6 s. Empreinte inchangée (1d53de903efd2b7c).

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-14 13:58:49 +02:00
Ryad Mehiri 00612ff797 Profil initial (gprof) de l'analyseur avant optimisation
Version d'origine compilée en -O0 -g -pg : 7,6 s sans -pg (médiane de 5
exécutions), empreinte 1d53de903efd2b7c.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-14 13:57:23 +02:00
Maxime Menault 6165b37b51 Cours 2026-10-07 08:53:55 +02:00
Maxime Menault 0a0c3a518f Exemple du cours 2026-10-07 00:07:20 +02:00
Maxime Menault 6c6f358095 Analyseur.c 2026-10-06 23:40:17 +02:00