5 Commits

25 changed files with 1177 additions and 89 deletions
+7
View File
@@ -0,0 +1,7 @@
# Exécutables, rapports et profils produits localement.
/build/
/out/
/analyseur
/rapport.txt
/gmon.out
*.o
+25 -11
View File
@@ -30,8 +30,10 @@ Le profil initial conduit aux priorités suivantes, classées par gain attendu :
## 3. Optimisations et gains mesurés
Chaque gain est relatif à la version précédente. Les deux premières étapes
reposent sur une mesure ponctuelle ; les suivantes utilisent la médiane de
cinq exécutions par version.
reposent sur une mesure ponctuelle ; les étapes 03 à 05 utilisent la médiane
de cinq exécutions par version, les étapes 06 et 07 celle de dix exécutions,
et la normalisation celle de cinquante exécutions. Chaque comparaison est
faite sur la même machine ; les conditions peuvent varier entre les étapes.
| Optimisation | Modification | Avant | Après | Temps gagné |
| --- | --- | ---: | ---: | ---: |
@@ -40,29 +42,41 @@ cinq exécutions par version.
| Table de hachage | Recherche et insertion en O(1) en moyenne | 0,888 s | 0,831 s | 6,4 % |
| Longueurs et chaînes | Champ `taille`, arrêt sur `\0`, position de fin conservée | 0,832 s | 0,362 s | 56,5 % |
| Tri par tas | Tri en O(n log n), sans tableau supplémentaire | 0,367 s | 0,113 s | 69,3 % |
| Bigrammes | Deux lettres précédentes conservées, aucun appel à `est_lettre` | 0,1252 s | 0,1123 s | 10,3 % |
| Mots vides | Filtre par longueur et index de hachage séparé | 0,1007 s | 0,0543 s | 46,1 % |
| Normalisation | Table de conversion des octets, comparaison sur le même PC | 0,0569 s | 0,0508 s | 10,7 % |
La version finale utilise le hachage à la place de la dichotomie. Son gain
Le programme utilise le hachage à la place de la dichotomie. Son gain
supplémentaire reste limité car la recherche était déjà efficace.
Tous les appels à `longueur` sont supprimés. Le tri ne fait plus que
**129 602 appels à `doit_echanger`**, soit environ **133 fois moins**.
Le classement reste par fréquence décroissante, puis par ordre alphabétique.
La recherche des mots vides passe de **12 045 671 à 202 444 appels à
`egales`**. Les appels à `est_lettre` et `en_minuscule` sont supprimés.
Le gain de normalisation a été confirmé sur `salle235-06` : la nouvelle
version est plus rapide dans les 50 paires de mesures, en temps réel et CPU.
## 4. Bilan et validation
Une comparaison directe des versions initiale et finale donne les médianes
suivantes, sur cinq exécutions par version dans les mêmes conditions :
Le bilan global ci-dessous a été mesuré après le tri par tas (étape 05),
sur cinq exécutions par version dans les mêmes conditions. Les gains des
étapes suivantes sont mesurés séparément dans le tableau précédent.
| Mesure | Version initiale | Version finale |
| Mesure | Version initiale | Après le tri par tas |
| --- | ---: | ---: |
| Temps réel | 2,81 s | 0,11 s |
| Pic mémoire résident (RSS) | 6 664 Kio | 6 668 Kio |
Le programme est environ **25,5 fois plus rapide**, soit **96,1 % de temps
en moins** sur ce jeu de données.
Après le tri par tas, le programme est environ **25,5 fois plus rapide**,
soit **96,1 % de temps en moins** sur ce jeu de données.
Le rapport et la sortie console sont identiques octet par octet.
L'empreinte reste **`1d53de903efd2b7c`**.
L'empreinte reste **`1d53de903efd2b7c`**.
Sources : [notes](notes.md), [profil initial](out/profil_avant.txt),
[profil final](out/profil_apres_tri.txt) et [mesures globales](out/mesures_bilan.csv).
Sources : [notes](docs/notes.md), [ordre des profils](resultats/README.md),
[profil initial](resultats/profils/00_initial.txt),
[profil actuel](resultats/profils/08_normalisation.txt),
[mesures du bilan après tri](resultats/mesures/mesures_bilan_tri.csv) et
[comparaison de normalisation](resultats/mesures/comparaison_normalisation_meme_pc.csv).
+32
View File
@@ -0,0 +1,32 @@
CC = gcc
CFLAGS ?= -std=c11 -Wall -Wextra -Wpedantic -O0
SOURCE = src/analyseur.c
PROGRAMME = build/analyseur
PROGRAMME_PROFIL = build/profil/analyseur
.PHONY: all run check profile clean
all: $(PROGRAMME)
$(PROGRAMME): $(SOURCE) Makefile
mkdir -p $(@D)
$(CC) $(CPPFLAGS) $(CFLAGS) $< -o $@ $(LDFLAGS) $(LDLIBS)
run: $(PROGRAMME)
cd build && ./analyseur
check: run
cmp resultats/rapport_reference.txt build/rapport.txt
$(PROGRAMME_PROFIL): $(SOURCE) Makefile
mkdir -p $(@D)
$(CC) $(CPPFLAGS) $(CFLAGS) -pg $< -o $@ $(LDFLAGS) $(LDLIBS)
profile: $(PROGRAMME_PROFIL)
cd build/profil && ./analyseur
cd build/profil && gprof -b ./analyseur gmon.out > profil.txt
@printf 'Profil disponible dans build/profil/profil.txt\n'
clean:
rm -rf build
+41 -34
View File
@@ -1,45 +1,52 @@
# TD — Consignes
# Analyseur de fréquence de mots — TD R5.A.04
## Travail demandé
Optimisation d'un analyseur C par mesure du temps, étude des profils et
réduction du travail répété. Le rapport doit conserver l'empreinte
**`1d53de903efd2b7c`**.
1. **Mesurer**
## Organisation
Compilez le programme sans `-pg`, lancez-le avec `time`, puis notez le
temps d'exécution et l'empreinte mémoire.
```text
src/analyseur.c Programme principal
exemples/exemple.c Exemple de profiling fourni
docs/CONSIGNES.md Consignes originales du TD
docs/R5A04_Profiling_MM.pdf Support du cours
docs/notes.md Journal détaillé des mesures
resultats/profils/ Profils historiques numérotés de 00 à 08
resultats/mesures/ Mesures brutes CSV et conditions des expériences
resultats/rapport_reference.txt Rapport attendu
COMPTE_RENDU.md Compte rendu noté
build/ Fichiers générés localement, ignorés par Git
```
2. **Profiler**
## Compiler et vérifier
Recompilez en `-O0` avec `-pg`, lancez le programme, puis générez le
profil dans `profil_avant.txt` avec `gprof`.
GCC, GNU Make et `gprof` sont nécessaires pour les commandes de profiling.
Depuis la racine du dépôt :
3. **Analyser**
```bash
make # Compiler en -O0, sans instrumentation
make run # Exécuter ; le rapport est écrit dans build/rapport.txt
make check # Exécuter et comparer le rapport à la référence
make profile # Produire build/profil/profil.txt avec -pg et gprof
make clean # Supprimer les fichiers générés de build/
```
Étudiez le profil plat et le graphe d'appels : où le temps est-il passé,
et pourquoi ?
Pour mesurer le temps du programme après compilation :
4. **Proposer**
```bash
cd build
time ./analyseur
```
Listez les pistes d'amélioration, classées par gain attendu.
Les mesures de temps utilisent le binaire sans `-pg`. Les profils archivés
dans `resultats/` sont les résultats des différentes étapes ; `make profile`
écrit le nouveau profil dans `build/profil/`.
5. **Optimiser**
## Documents et résultats
Réalisez une optimisation par commit. L'empreinte mémoire doit rester
identique.
6. **Valider**
Reprofilez le programme dans `profil_apres.txt` et chiffrez le gain
obtenu.
## Compte rendu noté
Le fichier `COMPTE_RENDU.md` doit être présent à la racine de votre fork.
Il doit contenir :
- les temps avant et après optimisation ;
- l'analyse du profil ;
- les pistes d'amélioration proposées ;
- les optimisations réalisées ;
- les gains mesurés.
> **Contrôle continu** — Le compte rendu est évalué dans le cadre du TD.
- [Compte rendu](COMPTE_RENDU.md)
- [Consignes du TD](docs/CONSIGNES.md) et [support PDF](docs/R5A04_Profiling_MM.pdf)
- [Journal des mesures](docs/notes.md)
- [Ordre des profils et expériences](resultats/README.md)
- [Comparaison de la normalisation sur le même PC](resultats/mesures/comparaison_normalisation_meme_pc.csv)
+45
View File
@@ -0,0 +1,45 @@
# TD — Consignes
## Travail demandé
1. **Mesurer**
Compilez le programme sans `-pg`, lancez-le avec `time`, puis notez le
temps d'exécution et l'empreinte mémoire.
2. **Profiler**
Recompilez en `-O0` avec `-pg`, lancez le programme, puis générez le
profil dans `profil_avant.txt` avec `gprof`.
3. **Analyser**
Étudiez le profil plat et le graphe d'appels : où le temps est-il passé,
et pourquoi ?
4. **Proposer**
Listez les pistes d'amélioration, classées par gain attendu.
5. **Optimiser**
Réalisez une optimisation par commit. L'empreinte mémoire doit rester
identique.
6. **Valider**
Reprofilez le programme dans `profil_apres.txt` et chiffrez le gain
obtenu.
## Compte rendu noté
Le fichier `COMPTE_RENDU.md` doit être présent à la racine de votre fork.
Il doit contenir :
- les temps avant et après optimisation ;
- l'analyse du profil ;
- les pistes d'amélioration proposées ;
- les optimisations réalisées ;
- les gains mesurés.
> **Contrôle continu** — Le compte rendu est évalué dans le cadre du TD.
+264 -10
View File
@@ -1,3 +1,10 @@
# Journal des mesures et optimisations
Ce journal conserve les commandes et sorties historiques, avec les chemins
utilisés au moment des mesures. Les liens vers les profils et les données
pointent vers leur emplacement actuel. Pour compiler et exécuter le projet
avec la nouvelle arborescence, voir le [README](../README.md).
Lancement du programme après la compilation avec `gcc -O0 analyseur.c -o analyseur`
```bash
@@ -96,7 +103,7 @@ 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](out/profil_apres.txt) :
Résultats du nouveau profil, conservé dans [01_dichotomie.txt](../resultats/profils/01_dichotomie.txt) :
| Mesure | Avant | Après |
| --- | ---: | ---: |
@@ -166,9 +173,9 @@ paramètre à `ecart_type_longueur`. La boucle utilise directement cette
valeur. Le calcul des statistiques passe ainsi de O(n²) à O(n), sans
allocation supplémentaire ni modification de la formule de variance.
Profil enregistré dans [out/profil_apres_moyenne.txt](out/profil_apres_moyenne.txt).
Profil enregistré dans [02_moyenne.txt](../resultats/profils/02_moyenne.txt).
La colonne « Avant » correspond à la version déjà optimisée pour
`chercher_mot`, dont le profil reste dans `out/profil_apres.txt`.
`chercher_mot`, dont le profil reste dans `../resultats/profils/01_dichotomie.txt`.
| Mesure | Avant | Après |
| --- | ---: | ---: |
@@ -242,9 +249,9 @@ cette machine. L'index est libéré après le comptage, avant le tri final
qui déplace les entrées. L'empreinte du rapport est conservée, mais cette
version utilise davantage de mémoire pendant le comptage.
Profil enregistré dans [out/profil_apres_hachage.txt](out/profil_apres_hachage.txt).
Profil enregistré dans [03_hachage.txt](../resultats/profils/03_hachage.txt).
La comparaison porte sur la version précédente avec dichotomie et moyenne
calculée une seule fois, conservée dans `out/profil_apres_moyenne.txt`.
calculée une seule fois, conservée dans `../resultats/profils/02_moyenne.txt`.
| Mesure | Dichotomie | Hachage |
| --- | ---: | ---: |
@@ -304,9 +311,9 @@ Le champ supplémentaire fait passer `sizeof(Entree)` de 36 à 40 octets sur
cette machine : le tableau alloué pour 20 000 entrées prend 80 000 octets
supplémentaires, soit environ 78 Kio.
Profil enregistré dans [out/profil_apres_longueurs.txt](out/profil_apres_longueurs.txt).
Profil enregistré dans [04_longueurs.txt](../resultats/profils/04_longueurs.txt).
La version précédente, avec la table de hachage, est décrite dans
`out/profil_apres_hachage.txt`.
`../resultats/profils/03_hachage.txt`.
| Mesure | Avant | Après |
| --- | ---: | ---: |
@@ -384,9 +391,9 @@ supplémentaire. `doit_echanger` reste inchangée : fréquence décroissante,
puis ordre alphabétique croissant. Chaque échange déplace l'entrée entière,
y compris la longueur mémorisée.
Profil enregistré dans [out/profil_apres_tri.txt](out/profil_apres_tri.txt).
Profil enregistré dans [05_tri.txt](../resultats/profils/05_tri.txt).
La comparaison porte sur la version précédente, décrite dans
`out/profil_apres_longueurs.txt`.
`../resultats/profils/04_longueurs.txt`.
| Mesure | Tri à bulles | Tri par tas |
| --- | ---: | ---: |
@@ -442,4 +449,251 @@ Empreinte du rapport : 1d53de903efd2b7c
real 0m0.354s
user 0m0.314s
sys 0m0.008s
```
```
## Réduction des vérifications dans `analyser_bigrammes`
L'ancienne boucle examinait des fenêtres de trois caractères et appelait
`est_lettre` jusqu'à trois fois par fenêtre. Les caractères des fenêtres
voisines étaient donc vérifiés plusieurs fois, pour un total de
3 757 672 appels dans cette fonction.
Les lignes sont déjà normalisées avant l'analyse : elles ne contiennent
que des lettres de `a` à `z` et des espaces. La nouvelle boucle utilise
cette propriété, explicitée dans le commentaire de la fonction, et
conserve les indices des deux lettres précédentes. Chaque nouvelle lettre
complète un trigramme si deux lettres la précèdent. Un espace ou une
nouvelle ligne réinitialise cet historique.
Les trigrammes qui se chevauchent sont conservés, sans compter à travers
les séparateurs. Le calcul du meilleur bigramme et les règles de départage
restent identiques. Les deux versions sont en O(nombre de caractères) :
le gain vient des vérifications et des appels évités, sans tableau
supplémentaire.
Profil enregistré dans [06_bigrammes.txt](../resultats/profils/06_bigrammes.txt).
La comparaison porte sur la version précédente, décrite dans
`../resultats/profils/05_tri.txt`.
| Mesure | Avant | Après |
| --- | ---: | ---: |
| Appels à `est_lettre` depuis `analyser_bigrammes` | 3 757 672 | 0 |
| Appels à `est_lettre` dans tout le programme | 5 297 256 | 1 539 584 |
| Temps réel médian sans profiling (`gcc -O0`, 10 exécutions par version) | 0,1252 s | 0,1123 s |
Le gain médian mesuré est de 10,3 %. Les exécutions sont courtes et les
temps fluctuent ; cette valeur est indicative. Les mesures ont été faites
en alternant les deux versions sur la même machine :
- Avant : 0,1339 / 0,1132 / 0,1220 / 0,1146 / 0,1403 / 0,1118 / 0,1268 /
0,1235 / 0,1430 / 0,1373 s.
- Après : 0,1332 / 0,1035 / 0,1077 / 0,1133 / 0,1178 / 0,1131 / 0,1095 /
0,0994 / 0,1114 / 0,1193 s.
Validation : compilation sans avertissement avec `-Wall -Wextra -Wpedantic`,
rapport et sortie console identiques octet par octet sur les vingt
exécutions, avec `-pg` et sous AddressSanitizer et UndefinedBehaviorSanitizer.
L'empreinte reste **`1d53de903efd2b7c`**. Le bigramme reste `me`, avec
17 607 occurrences et `n` comme troisième lettre la plus fréquente.
Un test temporaire a comparé 43 cas à l'ancienne fonction : entrées vides
ou courtes, chevauchements, espaces, changements de ligne, égalités,
normalisation et données pseudo-aléatoires.
Autres pistes, à mesurer séparément :
- `est_mot_vide` provoque encore 12 045 671 appels à `egales`. Réutiliser
la longueur `k` pour exclure les mots plus longs que tous les mots vides,
puis consulter un index de hachage séparé, reste la priorité. L'ordre
du tableau `MOTS_VIDES`, utilisé pour générer le texte, doit être conservé.
- `normaliser_ligne` pourrait utiliser une table de conversion des octets
en minuscules ou espaces, pour regrouper classification et conversion.
- `decouper_lignes` pourrait utiliser des pointeurs dans le texte et
remplacer les sauts de ligne par `\0`, évitant les allocations et copies
par ligne. La libération de la mémoire devrait être adaptée en conséquence.
Commandes pour reproduire ce profil :
```bash
mkdir -p out/apres_bigrammes
gcc -O0 -pg analyseur.c -o out/apres_bigrammes/analyseur
(cd out/apres_bigrammes && ./analyseur && gprof -b ./analyseur gmon.out > ../profil_apres_bigrammes.txt)
```
## Optimisation de `est_mot_vide`
La recherche linéaire dans les 60 entrées de `MOTS_VIDES` est remplacée
par un index de hachage de 121 cases, construit au premier appel seulement.
Chaque case contient l'indice d'un mot + 1, ou zéro si elle est libre.
Les collisions sont résolues en avançant à la case suivante, avec retour
au début. Le doublon `ou` réutilise la même case : l'index contient donc
59 mots distincts et reste rempli à moins de 50 %.
L'initialisation calcule aussi la longueur maximale des mots vides,
actuellement 5 caractères. `est_mot_vide` reçoit la longueur `k`, déjà
connue lors du découpage, et rejette immédiatement les mots plus longs.
Sur ce texte, 107 019 mots sont ainsi exclus avant même le hachage.
Les autres recherches sont en O(1) en moyenne pour ces mots de longueur
bornée, avec un pire cas linéaire en cas de nombreuses collisions.
L'index est séparé de `MOTS_VIDES` : la liste originale, son ordre et son
doublon sont conservés pour produire exactement le même texte.
L'index et la longueur maximale occupent 488 octets sur cette machine,
sans allocation dynamique supplémentaire.
Profil enregistré dans [07_mots_vides.txt](../resultats/profils/07_mots_vides.txt).
La comparaison porte sur la version précédente, décrite dans
`../resultats/profils/06_bigrammes.txt`.
| Mesure | Avant | Après |
| --- | ---: | ---: |
| Appels à `est_mot_vide` | 250 000 | 250 000 |
| Appels à `egales` depuis `est_mot_vide` | 12 045 671 | 202 444 |
| Appels à `egales` lors de l'initialisation de l'index | 0 | 28 |
| Appels à `egales` dans tout le programme | 12 198 772 | 355 573 |
| Temps réel médian sans profiling (`gcc -O0`, 10 exécutions par version) | 0,1007 s | 0,0543 s |
La recherche des mots vides effectue environ 60 fois moins de comparaisons.
Le temps total baisse de 46,1 %, soit une accélération d'environ 1,86.
Les mesures ont été réalisées en alternant les deux versions sur la même
machine :
- Avant : 0,0998 / 0,0953 / 0,0997 / 0,1015 / 0,1170 / 0,1067 / 0,1102 /
0,0999 / 0,1018 / 0,0989 s.
- Après : 0,0531 / 0,0535 / 0,0565 / 0,0542 / 0,0554 / 0,0544 / 0,0577 /
0,0579 / 0,0520 / 0,0522 s.
Validation : compilation sans avertissement avec `-Wall -Wextra -Wpedantic`,
rapport et sortie console identiques octet par octet sur les vingt
exécutions, avec `-pg` et sous AddressSanitizer et UndefinedBehaviorSanitizer.
L'empreinte reste **`1d53de903efd2b7c`**.
Un test temporaire a comparé les réponses à une recherche linéaire pour
les 60 entrées, leurs préfixes et suffixes, les 18 278 chaînes minuscules
de 1 à 3 caractères, 50 000 mots pseudo-aléatoires et les 7 000 mots du
vocabulaire. Un dictionnaire synthétique dans un processus séparé a
également vérifié les collisions avec retour à la première case et
l'adaptation automatique à des mots vides de plus de 5 caractères.
Commandes pour reproduire ce profil :
```bash
mkdir -p out/apres_mots_vides
gcc -O0 -pg analyseur.c -o out/apres_mots_vides/analyseur
(cd out/apres_mots_vides && ./analyseur && gprof -b ./analyseur gmon.out > ../profil_apres_mots_vides.txt)
```
```bash
[rabot@salle222-12 out]$ gcc -O0 ../analyseur.c -o analyseur
[rabot@salle222-12 out]$ 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 0m0.078s
user 0m0.059s
sys 0m0.001s
```
## Table de conversion pour `normaliser_ligne`
Une table de 256 cases mémorise le résultat de la normalisation de chaque
octet. Elle est initialisée au premier appel : les majuscules deviennent
des minuscules, les minuscules sont conservées et les autres caractères
deviennent des espaces. La boucle applique ensuite directement
`conversion[(unsigned char)ligne[i]]`, jusqu'au premier `\0`.
La conversion en `unsigned char` garantit un indice entre 0 et 255,
y compris pour les octets supérieurs à 127. Le comportement reste celui
du programme initial : seules les lettres ASCII sont conservées.
Les fonctions `est_lettre` et `en_minuscule`, devenues inutilisées, sont
supprimées. Le parcours reste en O(longueur de la ligne), avec moins de
tests et sans appel de fonction pour chaque caractère.
La table occupe 256 octets, auxquels s'ajoute l'indicateur d'initialisation
de 4 octets sur cette machine, sans allocation dynamique.
Profil enregistré dans [08_normalisation.txt](../resultats/profils/08_normalisation.txt).
La comparaison porte sur la version précédente, décrite dans
`../resultats/profils/07_mots_vides.txt`.
| Mesure | Avant | Après |
| --- | ---: | ---: |
| Appels à `normaliser_ligne` | 21 746 | 21 746 |
| Appels à `est_lettre` | 1 539 584 | 0 |
| Appels à `en_minuscule` | 1 266 663 | 0 |
| Temps réel médian sans profiling (`gcc -O0`, 10 exécutions par version) | 0,0577 s | 0,0508 s |
Le gain médian mesuré est de 11,9 %. Les mesures ont été réalisées en
alternant les deux versions sur la même machine :
- Avant : 0,0578 / 0,0587 / 0,0577 / 0,0574 / 0,0569 / 0,0573 / 0,0576 /
0,0572 / 0,0580 / 0,0583 s.
- Après : 0,0506 / 0,0509 / 0,0528 / 0,0511 / 0,0506 / 0,0503 / 0,0508 /
0,0512 / 0,0512 / 0,0503 s.
Validation : compilation sans avertissement avec `-Wall -Wextra -Wpedantic`,
rapport et sortie console identiques octet par octet sur les vingt
exécutions, avec `-pg` et sous AddressSanitizer et UndefinedBehaviorSanitizer.
L'empreinte reste **`1d53de903efd2b7c`**.
Des tests temporaires ont comparé la nouvelle fonction à l'ancienne sur
les 256 valeurs d'octet, une ligne vide, des caractères mélangés, des
octets après le premier zéro et une ligne de 65 536 octets. Ils vérifient
aussi qu'une seconde normalisation ne change plus le résultat, avec
`-fsigned-char` et `-funsigned-char`.
Commandes pour reproduire ce profil :
```bash
mkdir -p out/apres_normalisation
gcc -O0 -pg analyseur.c -o out/apres_normalisation/analyseur
(cd out/apres_normalisation && ./analyseur && gprof -b ./analyseur gmon.out > ../profil_apres_normalisation.txt)
```
## Vérification de la normalisation sur le même PC
Pour vérifier le gain malgré les changements de machine, les deux versions
ont été recompilées et comparées directement sur **salle235-06**, équipé
d'un **Intel Core i7-8700 à 3,20 GHz**, avec **GCC 16.2.1**.
La référence est le commit `1331811`, juste après l'optimisation de
`est_mot_vide`. La version comparée est le fichier `analyseur.c` avec la
table de conversion de `normaliser_ligne`. La différence de code porte
uniquement sur cette normalisation et la suppression des deux fonctions
utilitaires devenues inutilisées.
Protocole : mêmes options `-std=c11 -Wall -Wextra -Wpedantic -O0`, sans
`-pg`, cinq exécutions de chauffe par version, puis **50 mesures par
version**. Les versions sont exécutées successivement, en inversant
l'ordre à chaque paire, sur le même CPU logique (CPU 0). Le temps CPU
correspond à la somme des temps utilisateur et système du programme.
| Mesure médiane | Après `est_mot_vide` | Avec la nouvelle normalisation | Temps gagné |
| --- | ---: | ---: | ---: |
| Temps réel | 56,91 ms | 50,83 ms | 10,7 % |
| Temps CPU | 56,35 ms | 50,35 ms | 10,7 % |
La nouvelle version est plus rapide dans **50 paires sur 50**, en temps
réel comme en temps CPU. Le gain de la normalisation est donc confirmé
sur cette machine avec `-O0`. Il représente environ 6 ms par exécution.
Le rapport et la sortie console sont identiques sur les **110 exécutions**,
chauffe incluse. L'empreinte reste **`1d53de903efd2b7c`**.
Les [100 mesures brutes](../resultats/mesures/comparaison_normalisation_meme_pc.csv) sont
conservées, ainsi que les [conditions et statistiques détaillées](../resultats/mesures/comparaison_normalisation_meme_pc.json),
qui identifient le commit de référence et les deux sources utilisées.
View File
BIN
View File
Binary file not shown.
BIN
View File
Binary file not shown.
+32
View File
@@ -0,0 +1,32 @@
# Résultats conservés
Les profils suivent l'ordre des optimisations. Les commits indiqués
contiennent les versions de `analyseur.c` utilisées à ces étapes, avant
le déplacement des sources dans `src/`.
| Étape | Profil | Version du code |
| --- | --- | --- |
| 00 — Programme initial | [00_initial.txt](profils/00_initial.txt) | `6c6f358` |
| 01 — Recherche dichotomique | [01_dichotomie.txt](profils/01_dichotomie.txt) | `be387e2` |
| 02 — Moyenne calculée une fois | [02_moyenne.txt](profils/02_moyenne.txt) | `d3f1987` |
| 03 — Recherche par hachage | [03_hachage.txt](profils/03_hachage.txt) | `57aaec4` |
| 04 — Longueurs et positions de fin | [04_longueurs.txt](profils/04_longueurs.txt) | `1c4405c` |
| 05 — Tri par tas | [05_tri.txt](profils/05_tri.txt) | `57c9ce9` |
| 06 — Analyse des bigrammes | [06_bigrammes.txt](profils/06_bigrammes.txt) | `e3076e4` |
| 07 — Index des mots vides | [07_mots_vides.txt](profils/07_mots_vides.txt) | `1331811` |
| 08 — Table de normalisation | [08_normalisation.txt](profils/08_normalisation.txt) | `19ad9b7` |
Les [mesures du bilan après le tri](mesures/mesures_bilan_tri.csv) comparent
le programme initial à l'étape 05. La colonne `final` désigne cette étape.
La [comparaison de normalisation](mesures/comparaison_normalisation_meme_pc.csv)
compare les étapes 07 et 08 sur le même PC, avec 50 mesures par version.
Les [conditions et statistiques](mesures/comparaison_normalisation_meme_pc.json)
précisent la machine, le compilateur, les sources et le protocole.
Le [rapport de référence](rapport_reference.txt) conserve l'empreinte
`1d53de903efd2b7c`. `make check` compare le rapport courant à ce fichier.
Les commandes historiques et les autres mesures sont décrites dans le
[journal](../docs/notes.md). Chaque gain de temps doit être calculé à partir
de versions exécutées dans les mêmes conditions sur la même machine.
@@ -0,0 +1,101 @@
paire;ordre;version;reel_s;cpu_s;utilisateur_s;systeme_s
1;1;est_mot_vide;0.056491233;0.056122000;0.056122000;0.000000000
1;2;normalisation;0.051129444;0.050743000;0.047569000;0.003174000
2;1;normalisation;0.052859973;0.052213000;0.052213000;0.000000000
2;2;est_mot_vide;0.056553175;0.056188000;0.049163000;0.007025000
3;1;est_mot_vide;0.056646180;0.056260000;0.056260000;0.000000000
3;2;normalisation;0.050820813;0.050419000;0.047057000;0.003362000
4;1;normalisation;0.050511655;0.050148000;0.050148000;0.000000000
4;2;est_mot_vide;0.057633857;0.057267000;0.057267000;0.000000000
5;1;est_mot_vide;0.058931013;0.058517000;0.058517000;0.000000000
5;2;normalisation;0.050483512;0.050130000;0.050130000;0.000000000
6;1;normalisation;0.050571728;0.050031000;0.050031000;0.000000000
6;2;est_mot_vide;0.056469042;0.055864000;0.055864000;0.000000000
7;1;est_mot_vide;0.056786315;0.056209000;0.056209000;0.000000000
7;2;normalisation;0.054489662;0.054079000;0.054079000;0.000000000
8;1;normalisation;0.053364305;0.052960000;0.052960000;0.000000000
8;2;est_mot_vide;0.059938709;0.059504000;0.056200000;0.003304000
9;1;est_mot_vide;0.056927608;0.056355000;0.053024000;0.003331000
9;2;normalisation;0.050743650;0.050397000;0.050397000;0.000000000
10;1;normalisation;0.051437591;0.051059000;0.051059000;0.000000000
10;2;est_mot_vide;0.056612828;0.056236000;0.056236000;0.000000000
11;1;est_mot_vide;0.056272508;0.055704000;0.055704000;0.000000000
11;2;normalisation;0.050365767;0.050021000;0.046684000;0.003337000
12;1;normalisation;0.050671909;0.050125000;0.050125000;0.000000000
12;2;est_mot_vide;0.056635849;0.056280000;0.056280000;0.000000000
13;1;est_mot_vide;0.056769250;0.056186000;0.056186000;0.000000000
13;2;normalisation;0.050474641;0.050140000;0.050140000;0.000000000
14;1;normalisation;0.051163379;0.050578000;0.050578000;0.000000000
14;2;est_mot_vide;0.056933057;0.056577000;0.053247000;0.003330000
15;1;est_mot_vide;0.057398894;0.056795000;0.056795000;0.000000000
15;2;normalisation;0.050772062;0.050235000;0.050235000;0.000000000
16;1;normalisation;0.050913189;0.050575000;0.050575000;0.000000000
16;2;est_mot_vide;0.056655224;0.056318000;0.056318000;0.000000000
17;1;est_mot_vide;0.056525765;0.056190000;0.056190000;0.000000000
17;2;normalisation;0.050352528;0.050011000;0.050011000;0.000000000
18;1;normalisation;0.050842096;0.050096000;0.043787000;0.006309000
18;2;est_mot_vide;0.057116281;0.056570000;0.053229000;0.003341000
19;1;est_mot_vide;0.057103442;0.056740000;0.056740000;0.000000000
19;2;normalisation;0.050779039;0.050208000;0.046845000;0.003363000
20;1;normalisation;0.050054952;0.049702000;0.049702000;0.000000000
20;2;est_mot_vide;0.058944302;0.058092000;0.058092000;0.000000000
21;1;est_mot_vide;0.056722629;0.056347000;0.056347000;0.000000000
21;2;normalisation;0.050731609;0.050375000;0.047014000;0.003361000
22;1;normalisation;0.050819285;0.050259000;0.047104000;0.003155000
22;2;est_mot_vide;0.056630778;0.056063000;0.056063000;0.000000000
23;1;est_mot_vide;0.057257033;0.056642000;0.056642000;0.000000000
23;2;normalisation;0.051949088;0.051599000;0.048158000;0.003441000
24;1;normalisation;0.051005800;0.050636000;0.044301000;0.006335000
24;2;est_mot_vide;0.057043455;0.056271000;0.056271000;0.000000000
25;1;est_mot_vide;0.057602567;0.056820000;0.056820000;0.000000000
25;2;normalisation;0.050556449;0.050000000;0.050000000;0.000000000
26;1;normalisation;0.050617535;0.050016000;0.046668000;0.003348000
26;2;est_mot_vide;0.056347331;0.055776000;0.055776000;0.000000000
27;1;est_mot_vide;0.056876707;0.056082000;0.052755000;0.003327000
27;2;normalisation;0.050732818;0.049943000;0.046588000;0.003355000
28;1;normalisation;0.050696128;0.050356000;0.050356000;0.000000000
28;2;est_mot_vide;0.057392773;0.056837000;0.056837000;0.000000000
29;1;est_mot_vide;0.057540365;0.056687000;0.050339000;0.006348000
29;2;normalisation;0.050629883;0.050266000;0.050266000;0.000000000
30;1;normalisation;0.050633852;0.050301000;0.046944000;0.003357000
30;2;est_mot_vide;0.057387534;0.056604000;0.053263000;0.003341000
31;1;est_mot_vide;0.056705212;0.056221000;0.056221000;0.000000000
31;2;normalisation;0.051605342;0.050607000;0.050607000;0.000000000
32;1;normalisation;0.050774977;0.050195000;0.046832000;0.003363000
32;2;est_mot_vide;0.057347698;0.056481000;0.056481000;0.000000000
33;1;est_mot_vide;0.057314656;0.056493000;0.053142000;0.003351000
33;2;normalisation;0.051035417;0.050702000;0.047319000;0.003383000
34;1;normalisation;0.051096606;0.050325000;0.050325000;0.000000000
34;2;est_mot_vide;0.056984515;0.056397000;0.053065000;0.003332000
35;1;est_mot_vide;0.056948057;0.056378000;0.049735000;0.006643000
35;2;normalisation;0.050945416;0.050349000;0.047188000;0.003161000
36;1;normalisation;0.050665690;0.050325000;0.050325000;0.000000000
36;2;est_mot_vide;0.056564751;0.056024000;0.056024000;0.000000000
37;1;est_mot_vide;0.056814287;0.056267000;0.056267000;0.000000000
37;2;normalisation;0.050693901;0.050345000;0.050345000;0.000000000
38;1;normalisation;0.051073204;0.050687000;0.047516000;0.003171000
38;2;est_mot_vide;0.056708081;0.056123000;0.052807000;0.003316000
39;1;est_mot_vide;0.058150167;0.057529000;0.054130000;0.003399000
39;2;normalisation;0.051624538;0.051171000;0.047760000;0.003411000
40;1;normalisation;0.050851577;0.050450000;0.047083000;0.003367000
40;2;est_mot_vide;0.056863893;0.056294000;0.056294000;0.000000000
41;1;est_mot_vide;0.056938046;0.056313000;0.049663000;0.006650000
41;2;normalisation;0.051268160;0.050718000;0.050718000;0.000000000
42;1;normalisation;0.050889004;0.050469000;0.050469000;0.000000000
42;2;est_mot_vide;0.056899960;0.056519000;0.056519000;0.000000000
43;1;est_mot_vide;0.056661776;0.056094000;0.056094000;0.000000000
43;2;normalisation;0.051071801;0.050505000;0.050505000;0.000000000
44;1;normalisation;0.051212294;0.050659000;0.050659000;0.000000000
44;2;est_mot_vide;0.056953281;0.056597000;0.053266000;0.003331000
45;1;est_mot_vide;0.057247562;0.056689000;0.056689000;0.000000000
45;2;normalisation;0.051919210;0.051286000;0.047848000;0.003438000
46;1;normalisation;0.053911622;0.053561000;0.050211000;0.003350000
46;2;est_mot_vide;0.057280343;0.056880000;0.056880000;0.000000000
47;1;est_mot_vide;0.057210951;0.056736000;0.050053000;0.006683000
47;2;normalisation;0.050836595;0.050275000;0.050275000;0.000000000
48;1;normalisation;0.050400129;0.050021000;0.046687000;0.003334000
48;2;est_mot_vide;0.056861357;0.056310000;0.056310000;0.000000000
49;1;est_mot_vide;0.056884618;0.056497000;0.053181000;0.003316000
49;2;normalisation;0.050721396;0.050345000;0.046993000;0.003352000
50;1;normalisation;0.050842075;0.050114000;0.050114000;0.000000000
50;2;est_mot_vide;0.056320156;0.055765000;0.055765000;0.000000000
1 paire ordre version reel_s cpu_s utilisateur_s systeme_s
2 1 1 est_mot_vide 0.056491233 0.056122000 0.056122000 0.000000000
3 1 2 normalisation 0.051129444 0.050743000 0.047569000 0.003174000
4 2 1 normalisation 0.052859973 0.052213000 0.052213000 0.000000000
5 2 2 est_mot_vide 0.056553175 0.056188000 0.049163000 0.007025000
6 3 1 est_mot_vide 0.056646180 0.056260000 0.056260000 0.000000000
7 3 2 normalisation 0.050820813 0.050419000 0.047057000 0.003362000
8 4 1 normalisation 0.050511655 0.050148000 0.050148000 0.000000000
9 4 2 est_mot_vide 0.057633857 0.057267000 0.057267000 0.000000000
10 5 1 est_mot_vide 0.058931013 0.058517000 0.058517000 0.000000000
11 5 2 normalisation 0.050483512 0.050130000 0.050130000 0.000000000
12 6 1 normalisation 0.050571728 0.050031000 0.050031000 0.000000000
13 6 2 est_mot_vide 0.056469042 0.055864000 0.055864000 0.000000000
14 7 1 est_mot_vide 0.056786315 0.056209000 0.056209000 0.000000000
15 7 2 normalisation 0.054489662 0.054079000 0.054079000 0.000000000
16 8 1 normalisation 0.053364305 0.052960000 0.052960000 0.000000000
17 8 2 est_mot_vide 0.059938709 0.059504000 0.056200000 0.003304000
18 9 1 est_mot_vide 0.056927608 0.056355000 0.053024000 0.003331000
19 9 2 normalisation 0.050743650 0.050397000 0.050397000 0.000000000
20 10 1 normalisation 0.051437591 0.051059000 0.051059000 0.000000000
21 10 2 est_mot_vide 0.056612828 0.056236000 0.056236000 0.000000000
22 11 1 est_mot_vide 0.056272508 0.055704000 0.055704000 0.000000000
23 11 2 normalisation 0.050365767 0.050021000 0.046684000 0.003337000
24 12 1 normalisation 0.050671909 0.050125000 0.050125000 0.000000000
25 12 2 est_mot_vide 0.056635849 0.056280000 0.056280000 0.000000000
26 13 1 est_mot_vide 0.056769250 0.056186000 0.056186000 0.000000000
27 13 2 normalisation 0.050474641 0.050140000 0.050140000 0.000000000
28 14 1 normalisation 0.051163379 0.050578000 0.050578000 0.000000000
29 14 2 est_mot_vide 0.056933057 0.056577000 0.053247000 0.003330000
30 15 1 est_mot_vide 0.057398894 0.056795000 0.056795000 0.000000000
31 15 2 normalisation 0.050772062 0.050235000 0.050235000 0.000000000
32 16 1 normalisation 0.050913189 0.050575000 0.050575000 0.000000000
33 16 2 est_mot_vide 0.056655224 0.056318000 0.056318000 0.000000000
34 17 1 est_mot_vide 0.056525765 0.056190000 0.056190000 0.000000000
35 17 2 normalisation 0.050352528 0.050011000 0.050011000 0.000000000
36 18 1 normalisation 0.050842096 0.050096000 0.043787000 0.006309000
37 18 2 est_mot_vide 0.057116281 0.056570000 0.053229000 0.003341000
38 19 1 est_mot_vide 0.057103442 0.056740000 0.056740000 0.000000000
39 19 2 normalisation 0.050779039 0.050208000 0.046845000 0.003363000
40 20 1 normalisation 0.050054952 0.049702000 0.049702000 0.000000000
41 20 2 est_mot_vide 0.058944302 0.058092000 0.058092000 0.000000000
42 21 1 est_mot_vide 0.056722629 0.056347000 0.056347000 0.000000000
43 21 2 normalisation 0.050731609 0.050375000 0.047014000 0.003361000
44 22 1 normalisation 0.050819285 0.050259000 0.047104000 0.003155000
45 22 2 est_mot_vide 0.056630778 0.056063000 0.056063000 0.000000000
46 23 1 est_mot_vide 0.057257033 0.056642000 0.056642000 0.000000000
47 23 2 normalisation 0.051949088 0.051599000 0.048158000 0.003441000
48 24 1 normalisation 0.051005800 0.050636000 0.044301000 0.006335000
49 24 2 est_mot_vide 0.057043455 0.056271000 0.056271000 0.000000000
50 25 1 est_mot_vide 0.057602567 0.056820000 0.056820000 0.000000000
51 25 2 normalisation 0.050556449 0.050000000 0.050000000 0.000000000
52 26 1 normalisation 0.050617535 0.050016000 0.046668000 0.003348000
53 26 2 est_mot_vide 0.056347331 0.055776000 0.055776000 0.000000000
54 27 1 est_mot_vide 0.056876707 0.056082000 0.052755000 0.003327000
55 27 2 normalisation 0.050732818 0.049943000 0.046588000 0.003355000
56 28 1 normalisation 0.050696128 0.050356000 0.050356000 0.000000000
57 28 2 est_mot_vide 0.057392773 0.056837000 0.056837000 0.000000000
58 29 1 est_mot_vide 0.057540365 0.056687000 0.050339000 0.006348000
59 29 2 normalisation 0.050629883 0.050266000 0.050266000 0.000000000
60 30 1 normalisation 0.050633852 0.050301000 0.046944000 0.003357000
61 30 2 est_mot_vide 0.057387534 0.056604000 0.053263000 0.003341000
62 31 1 est_mot_vide 0.056705212 0.056221000 0.056221000 0.000000000
63 31 2 normalisation 0.051605342 0.050607000 0.050607000 0.000000000
64 32 1 normalisation 0.050774977 0.050195000 0.046832000 0.003363000
65 32 2 est_mot_vide 0.057347698 0.056481000 0.056481000 0.000000000
66 33 1 est_mot_vide 0.057314656 0.056493000 0.053142000 0.003351000
67 33 2 normalisation 0.051035417 0.050702000 0.047319000 0.003383000
68 34 1 normalisation 0.051096606 0.050325000 0.050325000 0.000000000
69 34 2 est_mot_vide 0.056984515 0.056397000 0.053065000 0.003332000
70 35 1 est_mot_vide 0.056948057 0.056378000 0.049735000 0.006643000
71 35 2 normalisation 0.050945416 0.050349000 0.047188000 0.003161000
72 36 1 normalisation 0.050665690 0.050325000 0.050325000 0.000000000
73 36 2 est_mot_vide 0.056564751 0.056024000 0.056024000 0.000000000
74 37 1 est_mot_vide 0.056814287 0.056267000 0.056267000 0.000000000
75 37 2 normalisation 0.050693901 0.050345000 0.050345000 0.000000000
76 38 1 normalisation 0.051073204 0.050687000 0.047516000 0.003171000
77 38 2 est_mot_vide 0.056708081 0.056123000 0.052807000 0.003316000
78 39 1 est_mot_vide 0.058150167 0.057529000 0.054130000 0.003399000
79 39 2 normalisation 0.051624538 0.051171000 0.047760000 0.003411000
80 40 1 normalisation 0.050851577 0.050450000 0.047083000 0.003367000
81 40 2 est_mot_vide 0.056863893 0.056294000 0.056294000 0.000000000
82 41 1 est_mot_vide 0.056938046 0.056313000 0.049663000 0.006650000
83 41 2 normalisation 0.051268160 0.050718000 0.050718000 0.000000000
84 42 1 normalisation 0.050889004 0.050469000 0.050469000 0.000000000
85 42 2 est_mot_vide 0.056899960 0.056519000 0.056519000 0.000000000
86 43 1 est_mot_vide 0.056661776 0.056094000 0.056094000 0.000000000
87 43 2 normalisation 0.051071801 0.050505000 0.050505000 0.000000000
88 44 1 normalisation 0.051212294 0.050659000 0.050659000 0.000000000
89 44 2 est_mot_vide 0.056953281 0.056597000 0.053266000 0.003331000
90 45 1 est_mot_vide 0.057247562 0.056689000 0.056689000 0.000000000
91 45 2 normalisation 0.051919210 0.051286000 0.047848000 0.003438000
92 46 1 normalisation 0.053911622 0.053561000 0.050211000 0.003350000
93 46 2 est_mot_vide 0.057280343 0.056880000 0.056880000 0.000000000
94 47 1 est_mot_vide 0.057210951 0.056736000 0.050053000 0.006683000
95 47 2 normalisation 0.050836595 0.050275000 0.050275000 0.000000000
96 48 1 normalisation 0.050400129 0.050021000 0.046687000 0.003334000
97 48 2 est_mot_vide 0.056861357 0.056310000 0.056310000 0.000000000
98 49 1 est_mot_vide 0.056884618 0.056497000 0.053181000 0.003316000
99 49 2 normalisation 0.050721396 0.050345000 0.046993000 0.003352000
100 50 1 normalisation 0.050842075 0.050114000 0.050114000 0.000000000
101 50 2 est_mot_vide 0.056320156 0.055765000 0.055765000 0.000000000
@@ -0,0 +1,60 @@
{
"machine": "salle235-06",
"processeur": "Intel(R) Core(TM) i7-8700 CPU @ 3.20GHz",
"cpu_logique": 0,
"compilateur": "gcc (GCC) 16.2.1 20260810",
"options": [
"-std=c11",
"-Wall",
"-Wextra",
"-Wpedantic",
"-O0"
],
"profiling": false,
"reference_commit": "13318119ae97c3b2a76b99fdf85ce82d908865de",
"source_sha256": {
"est_mot_vide": "2bff822183b0e61b31c25b7ea6e6453bb20a69474a73558eb2b9113b9f1d92aa",
"normalisation": "6239cabc4e98a3e841be7e446d2690a24a51aab6719528ea7c0ee3da10562320"
},
"chauffe_par_version": 5,
"mesures_par_version": 50,
"empreinte_rapport": "1d53de903efd2b7c",
"est_mot_vide": {
"reel_s": {
"mediane": 0.056913783999999995,
"q1": 0.056656861999999995,
"q3": 0.0572745155,
"min": 0.056272508,
"max": 0.059938709
},
"cpu_s": {
"mediane": 0.056351000000000054,
"q1": 0.05619474999999996,
"q3": 0.05667575000000001,
"min": 0.055703999999999976,
"max": 0.05950400000000003
}
},
"normalisation": {
"reel_s": {
"mediane": 0.050828704,
"q1": 0.05066724475000001,
"q3": 0.0511212345,
"min": 0.050054952,
"max": 0.054489662
},
"cpu_s": {
"mediane": 0.050346999999999476,
"q1": 0.05014199999999988,
"q3": 0.05065324999999965,
"min": 0.04970199999999991,
"max": 0.05407899999999999
}
},
"gain_reel_pourcent": 10.691750877081008,
"gain_cpu_pourcent": 10.654646767582776,
"paires_plus_rapides": {
"reel_s": 50,
"cpu_s": 50
}
}
+162
View File
@@ -0,0 +1,162 @@
Flat profile:
Each sample counts as 0.01 seconds.
% cumulative self self total
time seconds seconds calls ms/call ms/call name
62.50 0.05 0.05 12198772 0.00 0.00 egales
12.50 0.06 0.01 1 10.00 10.00 analyser_bigrammes
12.50 0.07 0.01 1 10.00 10.00 decouper_lignes
12.50 0.08 0.01 _init
0.00 0.08 0.00 1539584 0.00 0.00 est_lettre
0.00 0.08 0.00 1266663 0.00 0.00 en_minuscule
0.00 0.08 0.00 928117 0.00 0.00 alea
0.00 0.08 0.00 250000 0.00 0.00 est_mot_vide
0.00 0.08 0.00 150182 0.00 0.00 chercher_mot
0.00 0.08 0.00 150182 0.00 0.00 compter_mot
0.00 0.08 0.00 150182 0.00 0.00 hacher_mot
0.00 0.08 0.00 129602 0.00 0.00 doit_echanger
0.00 0.08 0.00 32813 0.00 0.00 comparer
0.00 0.08 0.00 26801 0.00 0.00 ajouter
0.00 0.08 0.00 21746 0.00 0.00 compter_mots_ligne
0.00 0.08 0.00 21746 0.00 0.00 normaliser_ligne
0.00 0.08 0.00 8798 0.00 0.00 retablir_tas
0.00 0.08 0.00 5866 0.00 0.00 copier
0.00 0.08 0.00 1 0.00 0.00 construire_rapport
0.00 0.08 0.00 1 0.00 0.00 ecart_type_longueur
0.00 0.08 0.00 1 0.00 0.00 empreinte
0.00 0.08 0.00 1 0.00 0.00 generer_texte
0.00 0.08 0.00 1 0.00 0.00 generer_vocabulaire
0.00 0.08 0.00 1 0.00 0.00 longueur_moyenne
0.00 0.08 0.00 1 0.00 0.00 racine
0.00 0.08 0.00 1 0.00 0.00 trier_entrees
Call graph
granularity: each sample hit covers 4 byte(s) for 12.50% of 0.08 seconds
index % time self children called name
<spontaneous>
[1] 87.5 0.00 0.07 main [1]
0.00 0.05 21746/21746 compter_mots_ligne [3]
0.01 0.00 1/1 decouper_lignes [6]
0.01 0.00 1/1 analyser_bigrammes [5]
0.00 0.00 21746/21746 normaliser_ligne [17]
0.00 0.00 1/1 generer_vocabulaire [24]
0.00 0.00 1/1 generer_texte [23]
0.00 0.00 1/1 trier_entrees [27]
0.00 0.00 1/1 longueur_moyenne [25]
0.00 0.00 1/1 ecart_type_longueur [21]
0.00 0.00 1/1 racine [26]
0.00 0.00 1/1 construire_rapport [20]
0.00 0.00 1/1 empreinte [22]
-----------------------------------------------
0.00 0.00 153101/12198772 chercher_mot [8]
0.05 0.00 12045671/12198772 est_mot_vide [4]
[2] 62.5 0.05 0.00 12198772 egales [2]
-----------------------------------------------
0.00 0.05 21746/21746 main [1]
[3] 62.5 0.00 0.05 21746 compter_mots_ligne [3]
0.00 0.05 250000/250000 est_mot_vide [4]
0.00 0.00 150182/150182 compter_mot [9]
-----------------------------------------------
0.00 0.05 250000/250000 compter_mots_ligne [3]
[4] 61.7 0.00 0.05 250000 est_mot_vide [4]
0.05 0.00 12045671/12198772 egales [2]
-----------------------------------------------
0.01 0.00 1/1 main [1]
[5] 12.5 0.01 0.00 1 analyser_bigrammes [5]
-----------------------------------------------
0.01 0.00 1/1 main [1]
[6] 12.5 0.01 0.00 1 decouper_lignes [6]
-----------------------------------------------
<spontaneous>
[7] 12.5 0.01 0.00 _init [7]
-----------------------------------------------
0.00 0.00 150182/150182 compter_mot [9]
[8] 0.8 0.00 0.00 150182 chercher_mot [8]
0.00 0.00 153101/12198772 egales [2]
0.00 0.00 150182/150182 hacher_mot [13]
-----------------------------------------------
0.00 0.00 150182/150182 compter_mots_ligne [3]
[9] 0.8 0.00 0.00 150182 compter_mot [9]
0.00 0.00 150182/150182 chercher_mot [8]
0.00 0.00 5866/5866 copier [19]
-----------------------------------------------
0.00 0.00 1539584/1539584 normaliser_ligne [17]
[10] 0.0 0.00 0.00 1539584 est_lettre [10]
-----------------------------------------------
0.00 0.00 1266663/1266663 normaliser_ligne [17]
[11] 0.0 0.00 0.00 1266663 en_minuscule [11]
-----------------------------------------------
0.00 0.00 27934/928117 generer_vocabulaire [24]
0.00 0.00 900183/928117 generer_texte [23]
[12] 0.0 0.00 0.00 928117 alea [12]
-----------------------------------------------
0.00 0.00 150182/150182 chercher_mot [8]
[13] 0.0 0.00 0.00 150182 hacher_mot [13]
-----------------------------------------------
0.00 0.00 129602/129602 retablir_tas [18]
[14] 0.0 0.00 0.00 129602 doit_echanger [14]
0.00 0.00 32813/32813 comparer [15]
-----------------------------------------------
0.00 0.00 32813/32813 doit_echanger [14]
[15] 0.0 0.00 0.00 32813 comparer [15]
-----------------------------------------------
0.00 0.00 5867/26801 construire_rapport [20]
0.00 0.00 20934/26801 generer_vocabulaire [24]
[16] 0.0 0.00 0.00 26801 ajouter [16]
-----------------------------------------------
0.00 0.00 21746/21746 main [1]
[17] 0.0 0.00 0.00 21746 normaliser_ligne [17]
0.00 0.00 1539584/1539584 est_lettre [10]
0.00 0.00 1266663/1266663 en_minuscule [11]
-----------------------------------------------
0.00 0.00 8798/8798 trier_entrees [27]
[18] 0.0 0.00 0.00 8798 retablir_tas [18]
0.00 0.00 129602/129602 doit_echanger [14]
-----------------------------------------------
0.00 0.00 5866/5866 compter_mot [9]
[19] 0.0 0.00 0.00 5866 copier [19]
-----------------------------------------------
0.00 0.00 1/1 main [1]
[20] 0.0 0.00 0.00 1 construire_rapport [20]
0.00 0.00 5867/26801 ajouter [16]
-----------------------------------------------
0.00 0.00 1/1 main [1]
[21] 0.0 0.00 0.00 1 ecart_type_longueur [21]
-----------------------------------------------
0.00 0.00 1/1 main [1]
[22] 0.0 0.00 0.00 1 empreinte [22]
-----------------------------------------------
0.00 0.00 1/1 main [1]
[23] 0.0 0.00 0.00 1 generer_texte [23]
0.00 0.00 900183/928117 alea [12]
-----------------------------------------------
0.00 0.00 1/1 main [1]
[24] 0.0 0.00 0.00 1 generer_vocabulaire [24]
0.00 0.00 27934/928117 alea [12]
0.00 0.00 20934/26801 ajouter [16]
-----------------------------------------------
0.00 0.00 1/1 main [1]
[25] 0.0 0.00 0.00 1 longueur_moyenne [25]
-----------------------------------------------
0.00 0.00 1/1 main [1]
[26] 0.0 0.00 0.00 1 racine [26]
-----------------------------------------------
0.00 0.00 1/1 main [1]
[27] 0.0 0.00 0.00 1 trier_entrees [27]
0.00 0.00 8798/8798 retablir_tas [18]
-----------------------------------------------
Index by function name
[7] _init [19] copier [23] generer_texte
[16] ajouter [6] decouper_lignes [24] generer_vocabulaire
[12] alea [14] doit_echanger [13] hacher_mot
[5] analyser_bigrammes [21] ecart_type_longueur [25] longueur_moyenne
[8] chercher_mot [2] egales [17] normaliser_ligne
[15] comparer [22] empreinte [26] racine
[9] compter_mot [11] en_minuscule [18] retablir_tas
[3] compter_mots_ligne [10] est_lettre [27] trier_entrees
[20] construire_rapport [4] est_mot_vide
+169
View File
@@ -0,0 +1,169 @@
Flat profile:
Each sample counts as 0.01 seconds.
% cumulative self self total
time seconds seconds calls ms/call ms/call name
50.00 0.01 0.01 1 10.00 10.00 analyser_bigrammes
50.00 0.02 0.01 1 10.00 10.00 decouper_lignes
0.00 0.02 0.00 1539584 0.00 0.00 est_lettre
0.00 0.02 0.00 1266663 0.00 0.00 en_minuscule
0.00 0.02 0.00 928117 0.00 0.00 alea
0.00 0.02 0.00 355573 0.00 0.00 egales
0.00 0.02 0.00 293223 0.00 0.00 hacher_mot
0.00 0.02 0.00 250000 0.00 0.00 est_mot_vide
0.00 0.02 0.00 150182 0.00 0.00 chercher_mot
0.00 0.02 0.00 150182 0.00 0.00 compter_mot
0.00 0.02 0.00 129602 0.00 0.00 doit_echanger
0.00 0.02 0.00 32813 0.00 0.00 comparer
0.00 0.02 0.00 26801 0.00 0.00 ajouter
0.00 0.02 0.00 21746 0.00 0.00 compter_mots_ligne
0.00 0.02 0.00 21746 0.00 0.00 normaliser_ligne
0.00 0.02 0.00 8798 0.00 0.00 retablir_tas
0.00 0.02 0.00 5866 0.00 0.00 copier
0.00 0.02 0.00 1 0.00 0.00 construire_rapport
0.00 0.02 0.00 1 0.00 0.00 ecart_type_longueur
0.00 0.02 0.00 1 0.00 0.00 empreinte
0.00 0.02 0.00 1 0.00 0.00 generer_texte
0.00 0.02 0.00 1 0.00 0.00 generer_vocabulaire
0.00 0.02 0.00 1 0.00 0.00 initialiser_mots_vides
0.00 0.02 0.00 1 0.00 0.00 longueur_moyenne
0.00 0.02 0.00 1 0.00 0.00 racine
0.00 0.02 0.00 1 0.00 0.00 trier_entrees
Call graph
granularity: each sample hit covers 4 byte(s) for 50.00% of 0.02 seconds
index % time self children called name
<spontaneous>
[1] 100.0 0.00 0.02 main [1]
0.01 0.00 1/1 decouper_lignes [3]
0.01 0.00 1/1 analyser_bigrammes [2]
0.00 0.00 21746/21746 normaliser_ligne [16]
0.00 0.00 21746/21746 compter_mots_ligne [15]
0.00 0.00 1/1 generer_vocabulaire [23]
0.00 0.00 1/1 generer_texte [22]
0.00 0.00 1/1 trier_entrees [27]
0.00 0.00 1/1 longueur_moyenne [25]
0.00 0.00 1/1 ecart_type_longueur [20]
0.00 0.00 1/1 racine [26]
0.00 0.00 1/1 construire_rapport [19]
0.00 0.00 1/1 empreinte [21]
-----------------------------------------------
0.01 0.00 1/1 main [1]
[2] 50.0 0.01 0.00 1 analyser_bigrammes [2]
-----------------------------------------------
0.01 0.00 1/1 main [1]
[3] 50.0 0.01 0.00 1 decouper_lignes [3]
-----------------------------------------------
0.00 0.00 1539584/1539584 normaliser_ligne [16]
[4] 0.0 0.00 0.00 1539584 est_lettre [4]
-----------------------------------------------
0.00 0.00 1266663/1266663 normaliser_ligne [16]
[5] 0.0 0.00 0.00 1266663 en_minuscule [5]
-----------------------------------------------
0.00 0.00 27934/928117 generer_vocabulaire [23]
0.00 0.00 900183/928117 generer_texte [22]
[6] 0.0 0.00 0.00 928117 alea [6]
-----------------------------------------------
0.00 0.00 28/355573 initialiser_mots_vides [24]
0.00 0.00 153101/355573 chercher_mot [10]
0.00 0.00 202444/355573 est_mot_vide [9]
[7] 0.0 0.00 0.00 355573 egales [7]
-----------------------------------------------
0.00 0.00 60/293223 initialiser_mots_vides [24]
0.00 0.00 142981/293223 est_mot_vide [9]
0.00 0.00 150182/293223 chercher_mot [10]
[8] 0.0 0.00 0.00 293223 hacher_mot [8]
-----------------------------------------------
0.00 0.00 250000/250000 compter_mots_ligne [15]
[9] 0.0 0.00 0.00 250000 est_mot_vide [9]
0.00 0.00 202444/355573 egales [7]
0.00 0.00 142981/293223 hacher_mot [8]
0.00 0.00 1/1 initialiser_mots_vides [24]
-----------------------------------------------
0.00 0.00 150182/150182 compter_mot [11]
[10] 0.0 0.00 0.00 150182 chercher_mot [10]
0.00 0.00 153101/355573 egales [7]
0.00 0.00 150182/293223 hacher_mot [8]
-----------------------------------------------
0.00 0.00 150182/150182 compter_mots_ligne [15]
[11] 0.0 0.00 0.00 150182 compter_mot [11]
0.00 0.00 150182/150182 chercher_mot [10]
0.00 0.00 5866/5866 copier [18]
-----------------------------------------------
0.00 0.00 129602/129602 retablir_tas [17]
[12] 0.0 0.00 0.00 129602 doit_echanger [12]
0.00 0.00 32813/32813 comparer [13]
-----------------------------------------------
0.00 0.00 32813/32813 doit_echanger [12]
[13] 0.0 0.00 0.00 32813 comparer [13]
-----------------------------------------------
0.00 0.00 5867/26801 construire_rapport [19]
0.00 0.00 20934/26801 generer_vocabulaire [23]
[14] 0.0 0.00 0.00 26801 ajouter [14]
-----------------------------------------------
0.00 0.00 21746/21746 main [1]
[15] 0.0 0.00 0.00 21746 compter_mots_ligne [15]
0.00 0.00 250000/250000 est_mot_vide [9]
0.00 0.00 150182/150182 compter_mot [11]
-----------------------------------------------
0.00 0.00 21746/21746 main [1]
[16] 0.0 0.00 0.00 21746 normaliser_ligne [16]
0.00 0.00 1539584/1539584 est_lettre [4]
0.00 0.00 1266663/1266663 en_minuscule [5]
-----------------------------------------------
0.00 0.00 8798/8798 trier_entrees [27]
[17] 0.0 0.00 0.00 8798 retablir_tas [17]
0.00 0.00 129602/129602 doit_echanger [12]
-----------------------------------------------
0.00 0.00 5866/5866 compter_mot [11]
[18] 0.0 0.00 0.00 5866 copier [18]
-----------------------------------------------
0.00 0.00 1/1 main [1]
[19] 0.0 0.00 0.00 1 construire_rapport [19]
0.00 0.00 5867/26801 ajouter [14]
-----------------------------------------------
0.00 0.00 1/1 main [1]
[20] 0.0 0.00 0.00 1 ecart_type_longueur [20]
-----------------------------------------------
0.00 0.00 1/1 main [1]
[21] 0.0 0.00 0.00 1 empreinte [21]
-----------------------------------------------
0.00 0.00 1/1 main [1]
[22] 0.0 0.00 0.00 1 generer_texte [22]
0.00 0.00 900183/928117 alea [6]
-----------------------------------------------
0.00 0.00 1/1 main [1]
[23] 0.0 0.00 0.00 1 generer_vocabulaire [23]
0.00 0.00 27934/928117 alea [6]
0.00 0.00 20934/26801 ajouter [14]
-----------------------------------------------
0.00 0.00 1/1 est_mot_vide [9]
[24] 0.0 0.00 0.00 1 initialiser_mots_vides [24]
0.00 0.00 60/293223 hacher_mot [8]
0.00 0.00 28/355573 egales [7]
-----------------------------------------------
0.00 0.00 1/1 main [1]
[25] 0.0 0.00 0.00 1 longueur_moyenne [25]
-----------------------------------------------
0.00 0.00 1/1 main [1]
[26] 0.0 0.00 0.00 1 racine [26]
-----------------------------------------------
0.00 0.00 1/1 main [1]
[27] 0.0 0.00 0.00 1 trier_entrees [27]
0.00 0.00 8798/8798 retablir_tas [17]
-----------------------------------------------
Index by function name
[14] ajouter [3] decouper_lignes [23] generer_vocabulaire
[6] alea [12] doit_echanger [8] hacher_mot
[2] analyser_bigrammes [20] ecart_type_longueur [24] initialiser_mots_vides
[10] chercher_mot [7] egales [25] longueur_moyenne
[13] comparer [21] empreinte [16] normaliser_ligne
[11] compter_mot [5] en_minuscule [26] racine
[15] compter_mots_ligne [4] est_lettre [17] retablir_tas
[19] construire_rapport [9] est_mot_vide [27] trier_entrees
[18] copier [22] generer_texte
+158
View File
@@ -0,0 +1,158 @@
Flat profile:
Each sample counts as 0.01 seconds.
% cumulative self self total
time seconds seconds calls ns/call ns/call name
66.67 0.02 0.02 250000 80.00 80.00 est_mot_vide
33.33 0.03 0.01 21746 459.85 459.85 normaliser_ligne
0.00 0.03 0.00 928117 0.00 0.00 alea
0.00 0.03 0.00 355573 0.00 0.00 egales
0.00 0.03 0.00 293223 0.00 0.00 hacher_mot
0.00 0.03 0.00 150182 0.00 0.00 chercher_mot
0.00 0.03 0.00 150182 0.00 0.00 compter_mot
0.00 0.03 0.00 129602 0.00 0.00 doit_echanger
0.00 0.03 0.00 32813 0.00 0.00 comparer
0.00 0.03 0.00 26801 0.00 0.00 ajouter
0.00 0.03 0.00 21746 0.00 919.71 compter_mots_ligne
0.00 0.03 0.00 8798 0.00 0.00 retablir_tas
0.00 0.03 0.00 5866 0.00 0.00 copier
0.00 0.03 0.00 1 0.00 0.00 analyser_bigrammes
0.00 0.03 0.00 1 0.00 0.00 construire_rapport
0.00 0.03 0.00 1 0.00 0.00 decouper_lignes
0.00 0.03 0.00 1 0.00 0.00 ecart_type_longueur
0.00 0.03 0.00 1 0.00 0.00 empreinte
0.00 0.03 0.00 1 0.00 0.00 generer_texte
0.00 0.03 0.00 1 0.00 0.00 generer_vocabulaire
0.00 0.03 0.00 1 0.00 0.00 initialiser_mots_vides
0.00 0.03 0.00 1 0.00 0.00 longueur_moyenne
0.00 0.03 0.00 1 0.00 0.00 racine
0.00 0.03 0.00 1 0.00 0.00 trier_entrees
Call graph
granularity: each sample hit covers 4 byte(s) for 33.33% of 0.03 seconds
index % time self children called name
<spontaneous>
[1] 100.0 0.00 0.03 main [1]
0.00 0.02 21746/21746 compter_mots_ligne [3]
0.01 0.00 21746/21746 normaliser_ligne [4]
0.00 0.00 1/1 generer_vocabulaire [21]
0.00 0.00 1/1 generer_texte [20]
0.00 0.00 1/1 decouper_lignes [17]
0.00 0.00 1/1 trier_entrees [25]
0.00 0.00 1/1 longueur_moyenne [23]
0.00 0.00 1/1 ecart_type_longueur [18]
0.00 0.00 1/1 racine [24]
0.00 0.00 1/1 analyser_bigrammes [15]
0.00 0.00 1/1 construire_rapport [16]
0.00 0.00 1/1 empreinte [19]
-----------------------------------------------
0.02 0.00 250000/250000 compter_mots_ligne [3]
[2] 66.7 0.02 0.00 250000 est_mot_vide [2]
0.00 0.00 202444/355573 egales [6]
0.00 0.00 142981/293223 hacher_mot [7]
0.00 0.00 1/1 initialiser_mots_vides [22]
-----------------------------------------------
0.00 0.02 21746/21746 main [1]
[3] 66.7 0.00 0.02 21746 compter_mots_ligne [3]
0.02 0.00 250000/250000 est_mot_vide [2]
0.00 0.00 150182/150182 compter_mot [9]
-----------------------------------------------
0.01 0.00 21746/21746 main [1]
[4] 33.3 0.01 0.00 21746 normaliser_ligne [4]
-----------------------------------------------
0.00 0.00 27934/928117 generer_vocabulaire [21]
0.00 0.00 900183/928117 generer_texte [20]
[5] 0.0 0.00 0.00 928117 alea [5]
-----------------------------------------------
0.00 0.00 28/355573 initialiser_mots_vides [22]
0.00 0.00 153101/355573 chercher_mot [8]
0.00 0.00 202444/355573 est_mot_vide [2]
[6] 0.0 0.00 0.00 355573 egales [6]
-----------------------------------------------
0.00 0.00 60/293223 initialiser_mots_vides [22]
0.00 0.00 142981/293223 est_mot_vide [2]
0.00 0.00 150182/293223 chercher_mot [8]
[7] 0.0 0.00 0.00 293223 hacher_mot [7]
-----------------------------------------------
0.00 0.00 150182/150182 compter_mot [9]
[8] 0.0 0.00 0.00 150182 chercher_mot [8]
0.00 0.00 153101/355573 egales [6]
0.00 0.00 150182/293223 hacher_mot [7]
-----------------------------------------------
0.00 0.00 150182/150182 compter_mots_ligne [3]
[9] 0.0 0.00 0.00 150182 compter_mot [9]
0.00 0.00 150182/150182 chercher_mot [8]
0.00 0.00 5866/5866 copier [14]
-----------------------------------------------
0.00 0.00 129602/129602 retablir_tas [13]
[10] 0.0 0.00 0.00 129602 doit_echanger [10]
0.00 0.00 32813/32813 comparer [11]
-----------------------------------------------
0.00 0.00 32813/32813 doit_echanger [10]
[11] 0.0 0.00 0.00 32813 comparer [11]
-----------------------------------------------
0.00 0.00 5867/26801 construire_rapport [16]
0.00 0.00 20934/26801 generer_vocabulaire [21]
[12] 0.0 0.00 0.00 26801 ajouter [12]
-----------------------------------------------
0.00 0.00 8798/8798 trier_entrees [25]
[13] 0.0 0.00 0.00 8798 retablir_tas [13]
0.00 0.00 129602/129602 doit_echanger [10]
-----------------------------------------------
0.00 0.00 5866/5866 compter_mot [9]
[14] 0.0 0.00 0.00 5866 copier [14]
-----------------------------------------------
0.00 0.00 1/1 main [1]
[15] 0.0 0.00 0.00 1 analyser_bigrammes [15]
-----------------------------------------------
0.00 0.00 1/1 main [1]
[16] 0.0 0.00 0.00 1 construire_rapport [16]
0.00 0.00 5867/26801 ajouter [12]
-----------------------------------------------
0.00 0.00 1/1 main [1]
[17] 0.0 0.00 0.00 1 decouper_lignes [17]
-----------------------------------------------
0.00 0.00 1/1 main [1]
[18] 0.0 0.00 0.00 1 ecart_type_longueur [18]
-----------------------------------------------
0.00 0.00 1/1 main [1]
[19] 0.0 0.00 0.00 1 empreinte [19]
-----------------------------------------------
0.00 0.00 1/1 main [1]
[20] 0.0 0.00 0.00 1 generer_texte [20]
0.00 0.00 900183/928117 alea [5]
-----------------------------------------------
0.00 0.00 1/1 main [1]
[21] 0.0 0.00 0.00 1 generer_vocabulaire [21]
0.00 0.00 27934/928117 alea [5]
0.00 0.00 20934/26801 ajouter [12]
-----------------------------------------------
0.00 0.00 1/1 est_mot_vide [2]
[22] 0.0 0.00 0.00 1 initialiser_mots_vides [22]
0.00 0.00 60/293223 hacher_mot [7]
0.00 0.00 28/355573 egales [6]
-----------------------------------------------
0.00 0.00 1/1 main [1]
[23] 0.0 0.00 0.00 1 longueur_moyenne [23]
-----------------------------------------------
0.00 0.00 1/1 main [1]
[24] 0.0 0.00 0.00 1 racine [24]
-----------------------------------------------
0.00 0.00 1/1 main [1]
[25] 0.0 0.00 0.00 1 trier_entrees [25]
0.00 0.00 8798/8798 retablir_tas [13]
-----------------------------------------------
Index by function name
[12] ajouter [14] copier [21] generer_vocabulaire
[5] alea [17] decouper_lignes [7] hacher_mot
[15] analyser_bigrammes [10] doit_echanger [22] initialiser_mots_vides
[8] chercher_mot [18] ecart_type_longueur [23] longueur_moyenne
[11] comparer [6] egales [4] normaliser_ligne
[9] compter_mot [19] empreinte [24] racine
[3] compter_mots_ligne [2] est_mot_vide [13] retablir_tas
[16] construire_rapport [20] generer_texte [25] trier_entrees
+81 -34
View File
@@ -14,9 +14,11 @@
* L'empreinte affichée à la fin doit rester IDENTIQUE après optimisation :
* elle prouve que le résultat du programme n'a pas changé.
*
* Compilation : gcc -O0 -pg analyseur.c -o analyseur
* Exécution : ./analyseur
* Profil : gprof ./analyseur gmon.out > profil.txt
* Depuis la racine du dépôt :
* Compilation : make
* Exécution : make run
* Validation : make check
* Profil : make profile (build/profil/profil.txt)
*/
#include <stdio.h>
@@ -85,18 +87,6 @@ void ajouter(char *dest, const char *src, size_t *position)
*position = fin;
}
char en_minuscule(char c)
{
if (c >= 'A' && c <= 'Z')
return c - 'A' + 'a';
return c;
}
int est_lettre(char c)
{
return (c >= 'a' && c <= 'z') || (c >= 'A' && c <= 'Z');
}
/* ------------------------------------------------------------------------ */
/* Génération du texte */
/* ------------------------------------------------------------------------ */
@@ -110,6 +100,7 @@ static const char *MOTS_VIDES[] = {
"ses", "leur", "leurs", "mon", "ma", "mes", "ne", "pas", "plus", "est"
};
#define NB_MOTS_VIDES ((int)(sizeof(MOTS_VIDES) / sizeof(MOTS_VIDES[0])))
#define TAILLE_HACHAGE_VIDES (2 * NB_MOTS_VIDES + 1)
static const char *SYLLABES[] = {
"ba", "be", "bi", "bo", "ca", "co", "da", "de", "di", "fa", "fi", "ga",
@@ -209,12 +200,25 @@ char **decouper_lignes(const char *texte, int *nb_lignes)
void normaliser_ligne(char *ligne)
{
for (int i = 0; ligne[i] != '\0'; i++) {
if (est_lettre(ligne[i]))
ligne[i] = en_minuscule(ligne[i]);
else
ligne[i] = ' ';
static char conversion[256];
static int initialisee = 0;
if (!initialisee) {
for (int c = 0; c < 256; c++) {
if (c >= 'A' && c <= 'Z')
conversion[c] = (char)(c - 'A' + 'a');
else if (c >= 'a' && c <= 'z')
conversion[c] = (char)c;
else
conversion[c] = ' ';
}
conversion[0] = '\0';
initialisee = 1;
}
/* L'indice non signé couvre les 256 valeurs possibles d'un octet. */
for (int i = 0; ligne[i] != '\0'; i++)
ligne[i] = conversion[(unsigned char)ligne[i]];
}
/* ------------------------------------------------------------------------ */
@@ -227,15 +231,6 @@ typedef struct {
int taille;
} Entree;
int est_mot_vide(const char *mot)
{
for (int i = 0; i < NB_MOTS_VIDES; i++) {
if (egales(mot, MOTS_VIDES[i]))
return 1;
}
return 0;
}
unsigned int hacher_mot(const char *mot)
{
unsigned int h = 2166136261u;
@@ -246,6 +241,48 @@ unsigned int hacher_mot(const char *mot)
return h;
}
/* Construire un index séparé sans modifier la liste utilisée par le générateur.
* L'index est initialement rempli de zéros ; chaque case contient indice + 1. */
static int initialiser_mots_vides(int *index_mots_vides)
{
int taille_max = 0;
for (int i = 0; i < NB_MOTS_VIDES; i++) {
int taille = 0;
while (MOTS_VIDES[i][taille] != '\0')
taille++;
if (taille > taille_max)
taille_max = taille;
int position = hacher_mot(MOTS_VIDES[i]) % TAILLE_HACHAGE_VIDES;
while (index_mots_vides[position] != 0 &&
!egales(MOTS_VIDES[index_mots_vides[position] - 1], MOTS_VIDES[i]))
position = (position + 1) % TAILLE_HACHAGE_VIDES;
/* Un doublon, comme "ou", réutilise la même case. */
index_mots_vides[position] = i + 1;
}
return taille_max;
}
int est_mot_vide(const char *mot, int taille)
{
static int index_mots_vides[TAILLE_HACHAGE_VIDES];
static int taille_max = -1;
if (taille_max < 0)
taille_max = initialiser_mots_vides(index_mots_vides);
/* La taille provient du découpage : aucun nouveau parcours du mot. */
if (taille > taille_max)
return 0;
int position = hacher_mot(mot) % TAILLE_HACHAGE_VIDES;
while (index_mots_vides[position] != 0) {
if (egales(mot, MOTS_VIDES[index_mots_vides[position] - 1]))
return 1;
position = (position + 1) % TAILLE_HACHAGE_VIDES;
}
return 0;
}
/* L'index contient indice + 1 ; zéro désigne une case libre.
* Renvoie l'indice du mot, ou -(case libre + 1) s'il est absent. */
int chercher_mot(const Entree *table, const int *index_mots, const char *mot)
@@ -302,7 +339,7 @@ void compter_mots_ligne(Entree *table, int *nb_entrees, int *index_mots,
mot[k] = '\0';
if (k > 0) {
(*nb_mots_total)++;
if (!est_mot_vide(mot))
if (!est_mot_vide(mot, k))
compter_mot(table, nb_entrees, index_mots, mot, k);
}
}
@@ -373,7 +410,8 @@ double ecart_type_longueur(const Entree *table, int n, double moyenne)
}
/* Recherche du bigramme de lettres le plus fréquent, avec en bonus la
* troisième lettre qui le suit le plus souvent. */
* troisième lettre qui le suit le plus souvent.
* Les lignes doivent être normalisées : lettres 'a' à 'z' ou espaces. */
void analyser_bigrammes(char **lignes, int nb_lignes,
char *meilleur, int *occ_meilleur)
{
@@ -381,9 +419,18 @@ void analyser_bigrammes(char **lignes, int nb_lignes,
for (int l = 0; l < nb_lignes; l++) {
const char *s = lignes[l];
for (int i = 0; s[i] != '\0' && s[i + 1] != '\0' && s[i + 2] != '\0'; i++) {
if (est_lettre(s[i]) && est_lettre(s[i + 1]) && est_lettre(s[i + 2]))
trigrammes[s[i] - 'a'][s[i + 1] - 'a'][s[i + 2] - 'a']++;
int avant_dernier = -1;
int dernier = -1;
for (int i = 0; s[i] != '\0'; i++) {
if (s[i] == ' ') {
avant_dernier = dernier = -1;
continue;
}
int lettre = s[i] - 'a';
if (avant_dernier >= 0)
trigrammes[avant_dernier][dernier][lettre]++;
avant_dernier = dernier;
dernier = lettre;
}
}