forked from menault/2026_TD1_DEV51_Qualite_Algo
Compare commits
5 Commits
2878461ebd
...
875af6fe9e
| Author | SHA1 | Date | |
|---|---|---|---|
| 875af6fe9e | |||
| 19ad9b7b33 | |||
| 2abe610d58 | |||
| 13318119ae | |||
| e3076e46aa |
@@ -0,0 +1,7 @@
|
||||
# Exécutables, rapports et profils produits localement.
|
||||
/build/
|
||||
/out/
|
||||
/analyseur
|
||||
/rapport.txt
|
||||
/gmon.out
|
||||
*.o
|
||||
+25
-11
@@ -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).
|
||||
|
||||
@@ -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
|
||||
@@ -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)
|
||||
|
||||
@@ -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
@@ -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.
|
||||
Binary file not shown.
Binary file not shown.
@@ -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
|
||||
|
@@ -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
|
||||
}
|
||||
}
|
||||
@@ -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
|
||||
@@ -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
|
||||
@@ -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
|
||||
@@ -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;
|
||||
}
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user