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>
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>
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>
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>
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>
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>
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>
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>