6 Commits

35 changed files with 8741 additions and 532 deletions
+7
View File
@@ -0,0 +1,7 @@
# Exécutables, rapports et profils produits localement.
/build/
/out/
/analyseur
/rapport.txt
/gmon.out
*.o
+73 -12
View File
@@ -9,6 +9,9 @@
Réduire le temps d'exécution sans modifier les résultats, sur un texte fixe
contenant 250 000 mots et 5 866 mots distincts retenus.
Les sections 2 à 4 présentent ce corpus historique. La section 5 compare
le découpage sur 10 000 000 mots, volume désormais utilisé par défaut.
Les temps sont mesurés avec `gcc -O0`, sans `-pg`. Le profil est obtenu
séparément avec `gcc -O0 -pg` et `gprof`, car l'instrumentation ralentit le programme.
@@ -30,8 +33,11 @@ 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 les étapes de normalisation et de découpage 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 +46,84 @@ 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 % |
| Découpage | Pointeurs dans le texte, sans allocation ni copie par ligne | 0,0844 s | 0,0796 s | 5,6 % |
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.
Le découpage évite **21 746 allocations et libérations de lignes** ainsi
que **1 561 330 octets de stockage**, sans changer les lignes retournées.
Sur les 50 paires de mesures, le gain médian est de **5,6 % en temps réel**
et **9,8 % en temps CPU**. Le pic mémoire résident médian, mesuré séparément
cinq fois par version, passe de **6 688 à 4 896 Kio**. Les lignes partagent
le tampon `texte`, qui est conservé jusqu'à la fin de leur utilisation.
## 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`**.
Sur le corpus de 250 000 mots, le rapport et la sortie console sont
identiques octet par octet. 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).
Pour le découpage, `make check`, `make profile` et les tests sous
AddressSanitizer et UndefinedBehaviorSanitizer passent. Les cas vérifiés
incluent les lignes vides, les textes sans saut de ligne final et les
agrandissements du tableau de pointeurs.
## 5. Comparaison sur 10 millions de mots
`NB_MOTS_TEXTE` est porté à **10 000 000 dans les deux versions comparées**.
Sur le même CPU de `salle235-06`, deux mesures sans `-pg` sont effectuées
par version, en inversant l'ordre avant/après à la seconde paire. Un profil
est ensuite produit pour chaque version.
| Mesure | Avant découpage en place | Après découpage en place |
| --- | ---: | ---: |
| Temps réel moyen sans profiling | 2,0175 s | 1,7664 s |
| Temps CPU moyen sans profiling | 1,95 s | 1,72 s |
| Moyenne des pics RSS sans profiling | 145 780 Kio | 72 054 Kio |
| Temps propre de `decouper_lignes` dans le profil | 0,28 s | 0,12 s |
Sur ces deux mesures, le gain est de **12,4 % en temps réel**, **11,8 % en
temps CPU** et **50,6 % sur le pic RSS moyen**. Les profils contiennent
environ 165 et 157 échantillons attribués, contre seulement 3 et 7 dans
les anciennes captures comparées. Ils indiquent aussi une réduction du
temps du découpage ; les mesures sans `-pg` confirment le gain global.
Le nouveau texte contient **869 827 lignes** et **6 098 mots distincts**.
Le rapport et la sortie console sont identiques avant/après sur les six
exécutions. L'empreinte de ce volume est **`b35be1258a9cb3f6`**.
La référence historique à 250 000 mots est conservée séparément ;
`make check` utilise désormais la référence à 10 millions de mots.
Sources : [notes](docs/notes.md), [ordre des profils](resultats/README.md),
[profil initial](resultats/profils/00_initial.txt),
[profil après découpage à 250 000 mots](resultats/profils/09_decoupage.txt),
[mesures du bilan après tri](resultats/mesures/mesures_bilan_tri.csv),
[comparaison de normalisation](resultats/mesures/comparaison_normalisation_meme_pc.csv) et
[comparaison du découpage](resultats/mesures/comparaison_decoupage_meme_pc.csv),
[profils avant](resultats/profils/10000000_mots/avant_decoupage.txt) et
[après à 10 millions](resultats/profils/10000000_mots/apres_decoupage.txt),
[mesures à 10 millions](resultats/mesures/comparaison_decoupage_10000000.csv).
+33
View File
@@ -0,0 +1,33 @@
CC = gcc
CFLAGS ?= -std=c11 -Wall -Wextra -Wpedantic -O0
SOURCE = src/analyseur.c
PROGRAMME = build/analyseur
PROGRAMME_PROFIL = build/profil/analyseur
REFERENCE = resultats/rapport_reference_10000000.txt
.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 $(REFERENCE) 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
+51 -32
View File
@@ -1,45 +1,64 @@
# 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 programme traite désormais **10 000 000 mots**,
avec l'empreinte de référence **`b35be1258a9cb3f6`**.
1. **Mesurer**
Les résultats historiques sur **250 000 mots** conservent leur référence
**`1d53de903efd2b7c`**. L'empreinte se compare à volume de texte identique.
Compilez le programme sans `-pg`, lancez-le avec `time`, puis notez le
temps d'exécution et l'empreinte mémoire.
## Organisation
2. **Profiler**
```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 de 00 à 09 (250 000 mots)
resultats/profils/10000000_mots/ Comparaison avant/après sur 10 millions de mots
resultats/mesures/ Mesures brutes CSV et conditions des expériences
resultats/rapport_reference.txt Référence historique (250 000 mots)
resultats/rapport_reference_10000000.txt Référence actuelle (10 millions)
COMPTE_RENDU.md Compte rendu noté
build/ Fichiers générés localement, ignorés par Git
```
Recompilez en `-O0` avec `-pg`, lancez le programme, puis générez le
profil dans `profil_avant.txt` avec `gprof`.
## Compiler et vérifier
3. **Analyser**
GCC, GNU Make et `gprof` sont nécessaires pour les commandes de profiling.
Depuis la racine du dépôt :
Étudiez le profil plat et le graphe d'appels : où le temps est-il passé,
et pourquoi ?
```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 à la référence de 10 millions de mots
make profile # Produire build/profil/profil.txt avec -pg et gprof
make clean # Supprimer les fichiers générés de build/
```
4. **Proposer**
Pour mesurer le temps du programme après compilation :
Listez les pistes d'amélioration, classées par gain attendu.
```bash
cd build
time ./analyseur
```
5. **Optimiser**
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/`.
Réalisez une optimisation par commit. L'empreinte mémoire doit rester
identique.
Le [test à 10 millions de mots](resultats/mesures/comparaison_decoupage_10000000.json)
compare les versions avant et après le découpage en place, avec deux mesures
sans instrumentation et un profil par version. Les rapports des deux
versions sont identiques octet par octet.
6. **Valider**
## Documents et résultats
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)
- [Comparaison du découpage sur le même PC](resultats/mesures/comparaison_decoupage_meme_pc.csv)
- [Comparaison du découpage sur 10 millions de mots](resultats/mesures/comparaison_decoupage_10000000.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.
+834
View File
File diff suppressed because it is too large Load Diff
View File
-445
View File
@@ -1,445 +0,0 @@
Lancement du programme après la compilation avec `gcc -O0 analyseur.c -o analyseur`
```bash
Lignes analysées : 21746
Mots au total : 250000
Mots distincts : 5866
Longueur moyenne : 6.712 (écart-type 1.873)
Bigramme le + courant : "me" (17607 fois, souvent suivi de 'n')
Top 10 :
1. rane 287
2. fasi 241
3. tata 219
4. mopo 214
5. cofi 180
6. vesi 179
7. laganomo 177
8. boto 172
9. nopebo 169
10. rotion 165
Empreinte du rapport : 1d53de903efd2b7c
```
Et ensuite la commande time sur l'exécutable avec `time ./analyseur `
```bash
Lignes analysées : 21746
Mots au total : 250000
Mots distincts : 5866
Longueur moyenne : 6.712 (écart-type 1.873)
Bigramme le + courant : "me" (17607 fois, souvent suivi de 'n')
Top 10 :
1. rane 287
2. fasi 241
3. tata 219
4. mopo 214
5. cofi 180
6. vesi 179
7. laganomo 177
8. boto 172
9. nopebo 169
10. rotion 165
Empreinte du rapport : 1d53de903efd2b7c
real 0m2.858s
user 0m2.821s
sys 0m0.013s
```
On recompile avec le flag `-pg` : `gcc -O0 -pg analyseur.c -o analyseur`
Et on relance `time` dessus
```bash
Lignes analysées : 21746
Mots au total : 250000
Mots distincts : 5866
Longueur moyenne : 6.712 (écart-type 1.873)
Bigramme le + courant : "me" (17607 fois, souvent suivi de 'n')
Top 10 :
1. rane 287
2. fasi 241
3. tata 219
4. mopo 214
5. cofi 180
6. vesi 179
7. laganomo 177
8. boto 172
9. nopebo 169
10. rotion 165
Empreinte du rapport : 1d53de903efd2b7c
real 0m6.354s
user 0m6.295s
sys 0m0.020s
```
On lance `gprof` : `gprof -b ./analyseur gmon.out > profil_avant.txt`
## Optimisation de `chercher_mot` : recherche dichotomique
La recherche initiale parcourait toutes les entrées jusqu'à trouver le mot.
Pour 150 182 recherches, elle effectuait 296 656 203 appels à `egales()`.
Le tableau est maintenant maintenu dans l'ordre alphabétique pendant le
comptage. `chercher_mot` utilise `comparer()` pour éliminer la moitié des
entrées restantes à chaque étape : la recherche passe de O(n) à O(log n).
Si le mot est absent, la fonction renvoie `-(position d'insertion + 1)` ;
`compter_mot` retrouve cette position avec `-indice - 1`, décale les entrées
et insère le nouveau mot. Cette insertion reste en O(n), mais elle n'a lieu
qu'à la première apparition de chacun des 5 866 mots distincts.
Le tableau existant est réutilisé, sans allocation supplémentaire.
Le tri final par fréquence produit le même classement.
Résultats du nouveau profil, conservé dans [out/profil_apres.txt](out/profil_apres.txt) :
| Mesure | Avant | Après |
| --- | ---: | ---: |
| Appels de `chercher_mot` | 150 182 | 150 182 |
| Appels à `egales()` depuis `chercher_mot` | 296 656 203 | 0 |
| Comparaisons de chaînes dans `chercher_mot` | 296 656 203 | 1 718 447 |
| Appels à `egales()` dans tout le programme | 308 701 874 | 12 045 671 |
| Temps réel sans profiling (`gcc -O0`) | 2,80 s | 1,45 s |
Les recherches effectuent environ 173 fois moins de comparaisons.
Les appels restants à `egales()` viennent de `est_mot_vide`.
Les temps ci-dessus correspondent à une mesure avant/après sur la même
machine pendant cette modification : environ 48 % de temps en moins
(accélération d'environ 1,93). Ce sont des mesures ponctuelles.
Validation : compilation avec `-Wall -Wextra -Wpedantic`, rapport et sortie
console identiques octet par octet à la version initiale, avec et sans `-pg`.
L'empreinte reste **`1d53de903efd2b7c`**.
Un test temporaire sous AddressSanitizer et UndefinedBehaviorSanitizer a
également vérifié les recherches dans un tableau vide, les mots présents
ou absents, les insertions au début/milieu/fin, les doublons et les mots de
31 caractères, puis comparé 10 000 comptages à une référence linéaire.
Pour reproduire le profil sans écraser les fichiers du profil initial :
```bash
mkdir -p out/apres
gcc -O0 -pg analyseur.c -o out/apres/analyseur
(cd out/apres && ./analyseur && gprof -b ./analyseur gmon.out > ../profil_apres.txt)
```
```bash
Lignes analysées : 21746
Mots au total : 250000
Mots distincts : 5866
Longueur moyenne : 6.712 (écart-type 1.873)
Bigramme le + courant : "me" (17607 fois, souvent suivi de 'n')
Top 10 :
1. rane 287
2. fasi 241
3. tata 219
4. mopo 214
5. cofi 180
6. vesi 179
7. laganomo 177
8. boto 172
9. nopebo 169
10. rotion 165
Empreinte du rapport : 1d53de903efd2b7c
real 0m1.986s
user 0m1.934s
sys 0m0.011s
```
## Optimisation des appels à `longueur_moyenne`
`longueur_moyenne` parcourt les mots une fois par appel. Le coût excessif
venait de `ecart_type_longueur`, qui recalculait cette même moyenne à
chaque itération, soit 5 866 fois. Avec l'appel de `main`, cela représentait
5 867 calculs de moyenne et 34 415 822 appels à `longueur()`.
`main` calcule désormais la moyenne une seule fois et la transmet en
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).
La colonne « Avant » correspond à la version déjà optimisée pour
`chercher_mot`, dont le profil reste dans `out/profil_apres.txt`.
| Mesure | Avant | Après |
| --- | ---: | ---: |
| Appels à `longueur_moyenne` | 5 867 | 1 |
| Appels à `longueur()` depuis `longueur_moyenne` | 34 415 822 | 5 866 |
| Appels à `longueur()` dans tout le programme | 36 009 819 | 1 599 863 |
| Temps réel sans profiling (`gcc -O0`) | 1,46 s | 0,88 s |
Cette mesure ponctuelle sur la même machine donne environ 40 % de temps
en moins, soit une accélération d'environ 1,66 par rapport à l'étape précédente.
Validation : compilation avec `-Wall -Wextra -Wpedantic` sans avertissement,
puis comparaison du rapport et de la sortie console avant/après, avec et
sans `-pg`. Ils restent identiques octet par octet, y compris la moyenne
(`6.712`) et l'écart-type (`1.873`). L'empreinte reste **`1d53de903efd2b7c`**.
Commandes pour reproduire ce profil :
```bash
mkdir -p out/apres_moyenne
gcc -O0 -pg analyseur.c -o out/apres_moyenne/analyseur
(cd out/apres_moyenne && ./analyseur && gprof -b ./analyseur gmon.out > ../profil_apres_moyenne.txt)
```
```bash
[rabot@salle235-06 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 0m1.251s
user 0m1.214s
sys 0m0.004s
```
## Remplacement de la dichotomie par une table de hachage
Un index de 40 001 cases associe chaque mot à son entrée dans le tableau.
`hacher_mot` calcule un entier à partir des caractères du mot ; le modulo
donne la première case à examiner. Chaque case contient l'indice de
l'entrée + 1, ou zéro si elle est libre.
En cas de collision, `chercher_mot` vérifie le mot avec `egales()` puis
avance à la case suivante, en revenant au début si nécessaire. Deux mots
ayant le même hachage restent donc bien distincts. Les nouveaux mots sont
ajoutés à la fin du tableau, sans décaler les entrées existantes.
La recherche et l'insertion sont en O(1) en moyenne pour ces mots de
longueur bornée, avec un pire cas en O(n) en cas de nombreuses collisions.
La limite de 20 000 mots distincts est vérifiée avant chaque nouvelle
insertion ; avec 40 001 cases, l'index reste rempli à moins de 50 %.
Ce choix ajoute `40 001 * sizeof(int)` octets, soit environ 156 Kio sur
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).
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`.
| Mesure | Dichotomie | Hachage |
| --- | ---: | ---: |
| Appels de `chercher_mot` | 150 182 | 150 182 |
| Comparaisons de chaînes dans `chercher_mot` | 1 718 447 (`comparer`) | 153 101 (`egales`) |
| Temps réel médian sans profiling (`gcc -O0`, 5 exécutions par version) | 0,888 s | 0,831 s |
Les recherches font environ 11,2 fois moins de comparaisons. Le temps
total baisse d'environ 6,4 % : le gain reste limité car la normalisation
et le tri occupent désormais l'essentiel du temps. L'ordre d'arrivée des
mots remplace l'ordre alphabétique pendant le comptage ; le tri final
effectue donc un nombre différent de comparaisons, tout en produisant
le même classement.
Les cinq mesures, réalisées en alternant les deux versions sur la même
machine, sont respectivement : 0,883 / 0,892 / 0,888 / 0,883 / 0,888 s
avant, et 0,831 / 0,830 / 0,831 / 0,832 / 0,829 s après.
Validation : compilation sans avertissement avec `-Wall -Wextra -Wpedantic`,
rapport et sortie console identiques octet par octet sur les dix
exécutions et avec `-pg`. L'empreinte reste **`1d53de903efd2b7c`**.
Des tests temporaires sous AddressSanitizer et UndefinedBehaviorSanitizer
ont vérifié les collisions avec retour à la première case, les doublons,
les mots de 0/1/31 caractères, 10 000 comptages comparés à une référence
linéaire, les 20 000 entrées possibles et le refus d'un dépassement.
Le programme complet a également été exécuté avec ces deux outils,
sans erreur et avec une sortie identique.
Commandes pour reproduire ce profil :
```bash
mkdir -p out/apres_hachage
gcc -O0 -pg analyseur.c -o out/apres_hachage/analyseur
(cd out/apres_hachage && ./analyseur && gprof -b ./analyseur gmon.out > ../profil_apres_hachage.txt)
```
## Longueurs mémorisées et suppression des parcours répétés
Le champ `taille` de `Entree` mémorise la longueur du mot à son insertion.
La valeur vient directement de `k`, déjà calculé dans `compter_mots_ligne` :
aucun parcours supplémentaire n'est nécessaire. La moyenne et la variance
lisent désormais ce champ. Le tri déplace l'entrée entière, donc la longueur
reste associée au bon mot. Pour un mot tronqué, la taille enregistrée est
celle du mot conservé, soit au maximum 31 caractères.
Deux autres changements éliminent les recalculs sur les chaînes longues :
- `normaliser_ligne` s'arrête directement sur `ligne[i] == '\0'`. Le parcours
d'une ligne de L caractères passe de O(L²) à O(L).
- `ajouter` reçoit une position de fin, qu'il avance pendant la copie des
caractères ajoutés. Cette position est conservée lors de la construction
du rapport et réinitialisée pour chaque mot du vocabulaire. Le préfixe
déjà construit n'est plus parcouru à chaque ajout.
La fonction `longueur`, devenue inutilisée, a été supprimée.
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).
La version précédente, avec la table de hachage, est décrite dans
`out/profil_apres_hachage.txt`.
| Mesure | Avant | Après |
| --- | ---: | ---: |
| Appels à `longueur()` depuis les statistiques | 11 732 | 0 |
| Appels à `longueur()` depuis `normaliser_ligne` | 1 561 330 | 0 |
| Appels à `longueur()` depuis `ajouter` | 26 801 | 0 |
| Appels à `longueur()` au total | 1 599 863 | 0 |
| Temps réel médian sans profiling (`gcc -O0`, 5 exécutions par version) | 0,832 s | 0,362 s |
Le temps total baisse de 56,5 %, soit une accélération d'environ 2,30.
Cette mesure porte sur l'ensemble des trois changements, et ne doit pas
être attribuée uniquement au stockage de la longueur des mots.
Les cinq mesures, réalisées en alternant les deux versions sur la même
machine, sont respectivement : 0,835 / 0,838 / 0,830 / 0,832 / 0,829 s
avant, et 0,362 / 0,369 / 0,366 / 0,362 / 0,361 s après.
Validation : compilation sans avertissement avec `-Wall -Wextra -Wpedantic`,
rapport et sortie console identiques octet par octet sur les dix exécutions,
avec `-pg` et sous AddressSanitizer et UndefinedBehaviorSanitizer.
L'empreinte reste **`1d53de903efd2b7c`**, la moyenne `6.712` et l'écart-type
`1.873`. Des tests temporaires ont également vérifié les ajouts vides et
successifs jusqu'à la limite d'un tampon, la normalisation, les longueurs
avant/après tri, les statistiques, le rapport vide et les mots tronqués.
Commandes pour reproduire ce profil :
```bash
mkdir -p out/apres_longueurs
gcc -O0 -pg analyseur.c -o out/apres_longueurs/analyseur
(cd out/apres_longueurs && ./analyseur && gprof -b ./analyseur gmon.out > ../profil_apres_longueurs.txt)
```
```bash
[rabot@salle235-06 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.751s
user 0m0.703s
sys 0m0.004s
```
## Remplacement du tri à bulles par un tri par tas
Le tri à bulles effectuait systématiquement n(n - 1)/2 comparaisons,
soit 17 202 045 appels à `doit_echanger` pour 5 866 mots distincts.
`trier_entrees` utilise maintenant un tri par tas. La racine du tas contient
l'entrée qui doit apparaître le plus tard dans le classement. Elle est
échangée avec la dernière entrée de la partie non triée, puis `retablir_tas`
restaure cette propriété sur les entrées restantes. La construction du tas
coûte O(n), puis les extractions coûtent O(log n) chacune : le tri complet
passe de O(n²) à O(n log n), y compris dans le pire cas.
Le tri travaille directement dans le tableau, avec O(1) de mémoire
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).
La comparaison porte sur la version précédente, décrite dans
`out/profil_apres_longueurs.txt`.
| Mesure | Tri à bulles | Tri par tas |
| --- | ---: | ---: |
| Appels à `doit_echanger` pendant le tri | 17 202 045 | 129 602 |
| Appels à `comparer` pour départager les fréquences égales | 12 172 087 | 32 813 |
| Temps réel médian du programme sans profiling (`gcc -O0`, 5 exécutions par version) | 0,367 s | 0,113 s |
Le tri effectue environ 133 fois moins de comparaisons d'entrées.
Le temps total baisse de 69,3 %, soit une accélération d'environ 3,25.
Les cinq mesures, réalisées en alternant les deux versions sur la même
machine, sont respectivement : 0,365 / 0,363 / 0,372 / 0,383 / 0,367 s
avant, et 0,112 / 0,113 / 0,115 / 0,113 / 0,112 s après.
Validation : compilation sans avertissement avec `-Wall -Wextra -Wpedantic`,
rapport et sortie console identiques octet par octet sur les dix exécutions,
avec `-pg` et sous AddressSanitizer et UndefinedBehaviorSanitizer.
L'empreinte reste **`1d53de903efd2b7c`**.
Des tests temporaires ont comparé le résultat à `qsort` sur des tableaux
de 0 à 20 000 entrées, aléatoires, déjà triés ou inversés. Ils vérifient
aussi les fréquences égales, les doublons, les préfixes, les valeurs
extrêmes de fréquence et la conservation des longueurs des mots.
Commandes pour reproduire ce profil :
```bash
mkdir -p out/apres_tri
gcc -O0 -pg analyseur.c -o out/apres_tri/analyseur
(cd out/apres_tri && ./analyseur && gprof -b ./analyseur gmon.out > ../profil_apres_tri.txt)
```
```bash
[rabot@salle235-06 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.354s
user 0m0.314s
sys 0m0.008s
```
BIN
View File
Binary file not shown.
BIN
View File
Binary file not shown.
+56
View File
@@ -0,0 +1,56 @@
# Résultats conservés
Les profils 00 à 09 portent sur **250 000 mots** et suivent l'ordre des
optimisations. Les commits des étapes
00 à 08 contiennent les versions de `analyseur.c` avant son déplacement
dans `src/`. Pour l'étape 09, les conditions de mesure identifient le
commit de référence et les empreintes SHA-256 des deux sources comparées.
| É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` |
| 09 — Découpage en place | [09_decoupage.txt](profils/09_decoupage.txt) | [Sources et empreintes SHA-256](mesures/comparaison_decoupage_meme_pc.json) |
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.
La [comparaison du découpage](mesures/comparaison_decoupage_meme_pc.csv)
compare les étapes 08 et 09 sur le même PC, avec 50 mesures de temps par
version. Le [pic mémoire](mesures/comparaison_decoupage_memoire.csv) est
mesuré séparément avec GNU time, cinq fois par version. Les
[conditions et statistiques](mesures/comparaison_decoupage_meme_pc.json)
décrivent les deux séries et les vérifications des résultats.
La comparaison complémentaire à **10 000 000 mots** est conservée séparément :
- [Profil avant découpage](profils/10000000_mots/avant_decoupage.txt).
- [Profil après découpage](profils/10000000_mots/apres_decoupage.txt).
- [Mesures brutes](mesures/comparaison_decoupage_10000000.csv) et
[conditions et statistiques](mesures/comparaison_decoupage_10000000.json).
Elle utilise deux mesures sans `-pg` et une exécution profilée par version,
sur le même CPU. Le seul changement de la version de référence est le
nombre de mots ; la version comparée ajoute le découpage en place.
Le [rapport historique](rapport_reference.txt), pour 250 000 mots, conserve
l'empreinte `1d53de903efd2b7c`. La [référence actuelle à 10 millions](rapport_reference_10000000.txt)
a l'empreinte `b35be1258a9cb3f6`. Elle provient de la version avant découpage
et a été vérifiée à l'identique avec la version après découpage.
`make check` compare maintenant le rapport courant à cette nouvelle référence.
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,5 @@
paire;ordre;version;reel_s;cpu_s;utilisateur_s;systeme_s;rss_max_kio
1;1;avant_decoupage;2.041986573;1.960000000;1.930000000;0.030000000;145776
1;2;apres_decoupage;1.767853857;1.720000000;1.710000000;0.010000000;71796
2;1;apres_decoupage;1.764871005;1.720000000;1.710000000;0.010000000;72312
2;2;avant_decoupage;1.993093881;1.940000000;1.920000000;0.020000000;145784
1 paire ordre version reel_s cpu_s utilisateur_s systeme_s rss_max_kio
2 1 1 avant_decoupage 2.041986573 1.960000000 1.930000000 0.030000000 145776
3 1 2 apres_decoupage 1.767853857 1.720000000 1.710000000 0.010000000 71796
4 2 1 apres_decoupage 1.764871005 1.720000000 1.710000000 0.010000000 72312
5 2 2 avant_decoupage 1.993093881 1.940000000 1.920000000 0.020000000 145784
@@ -0,0 +1,111 @@
{
"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"
],
"nb_mots_texte": 10000000,
"nb_lignes": 869827,
"nb_mots_distincts": 6098,
"reference_commit": "875af6fe9eaee7a2a9a997c7fe4102d216a1b9fb",
"reference_adaptation": "NB_MOTS_TEXTE porté de 250000 à 10000000 dans les deux versions",
"source_sha256": {
"avant_decoupage": "41fb23d6bbd63a6f2b9b127b0b877ac4bd133874562940930c81cd76917137ff",
"apres_decoupage": "7bbb1dc588d2ec82cbb700b135bbdf308bff1a684598c334a5c86bb054c8e04c"
},
"mesures_sans_pg_par_version": 2,
"executions_profilees_par_version": 1,
"executions_verifiees": 6,
"ordre_mesures": "avant/après puis après/avant",
"horloge_reelle": "time.perf_counter, lancement du programme via GNU time inclus",
"temps_cpu_et_memoire": "/usr/bin/time -f %U;%S;%M : temps CPU au centième de seconde et RSS maximal en Kio",
"repertoire_execution": "build/verification_10000000_thn5_mfx",
"empreinte_rapport": "b35be1258a9cb3f6",
"rapport_reference": "resultats/rapport_reference_10000000.txt",
"reference_validee_depuis": "version avant découpage à 10000000 mots",
"profils": {
"avant_decoupage": {
"fichier": "resultats/profils/10000000_mots/avant_decoupage.txt",
"temps_attribue_s": 1.65,
"periode_echantillon_s": 0.01,
"echantillons_attribues": 165,
"decouper_lignes_self_s": 0.28,
"execution_profilee": {
"reel_s": 2.700588346000586,
"cpu_s": 2.63,
"utilisateur_s": 2.61,
"systeme_s": 0.02,
"rss_max_kio": 145812
}
},
"apres_decoupage": {
"fichier": "resultats/profils/10000000_mots/apres_decoupage.txt",
"temps_attribue_s": 1.57,
"periode_echantillon_s": 0.01,
"echantillons_attribues": 157,
"decouper_lignes_self_s": 0.12,
"execution_profilee": {
"reel_s": 2.4980121059998055,
"cpu_s": 2.43,
"utilisateur_s": 2.43,
"systeme_s": 0.0,
"rss_max_kio": 72384
}
}
},
"avant_decoupage": {
"reel_s": {
"mesures": [
2.041986573000031,
1.9930938809993677
],
"moyenne": 2.0175402269996994
},
"cpu_s": {
"mesures": [
1.96,
1.94
],
"moyenne": 1.95
},
"rss_max_kio": {
"mesures": [
145776,
145784
],
"moyenne": 145780
}
},
"apres_decoupage": {
"reel_s": {
"mesures": [
1.7678538569998636,
1.7648710049998044
],
"moyenne": 1.766362430999834
},
"cpu_s": {
"mesures": [
1.72,
1.72
],
"moyenne": 1.72
},
"rss_max_kio": {
"mesures": [
71796,
72312
],
"moyenne": 72054
}
},
"gain_reel_pourcent": 12.449704478675693,
"gain_cpu_pourcent": 11.794871794871797,
"gain_rss_pourcent": 50.57346686788311
}
@@ -0,0 +1,101 @@
paire;ordre;version;reel_s;cpu_s;utilisateur_s;systeme_s
1;1;normalisation;0.098564077;0.066697000;0.063348000;0.003349000
1;2;decoupage;0.077939649;0.049954000;0.046830000;0.003124000
2;1;decoupage;0.079878005;0.049596000;0.049596000;0.000000000
2;2;normalisation;0.086629509;0.057711000;0.057711000;0.000000000
3;1;normalisation;0.086206658;0.054246000;0.054246000;0.000000000
3;2;decoupage;0.077741974;0.048682000;0.045429000;0.003253000
4;1;decoupage;0.076489187;0.050586000;0.050586000;0.000000000
4;2;normalisation;0.081969255;0.055426000;0.048897000;0.006529000
5;1;normalisation;0.084525585;0.055295000;0.055295000;0.000000000
5;2;decoupage;0.082314577;0.050980000;0.050980000;0.000000000
6;1;decoupage;0.086664939;0.050787000;0.050787000;0.000000000
6;2;normalisation;0.091178679;0.059710000;0.059710000;0.000000000
7;1;normalisation;0.122270653;0.091533000;0.084745000;0.006788000
7;2;decoupage;0.088566138;0.059787000;0.056466000;0.003321000
8;1;decoupage;0.074593149;0.048882000;0.045816000;0.003066000
8;2;normalisation;0.082676622;0.054373000;0.050965000;0.003408000
9;1;normalisation;0.077770477;0.052938000;0.049816000;0.003122000
9;2;decoupage;0.081749320;0.050059000;0.046735000;0.003324000
10;1;decoupage;0.107211398;0.080546000;0.077318000;0.003228000
10;2;normalisation;0.079203746;0.054812000;0.054812000;0.000000000
11;1;normalisation;0.107278623;0.081262000;0.077865000;0.003397000
11;2;decoupage;0.074858666;0.047378000;0.047378000;0.000000000
12;1;decoupage;0.074898321;0.047529000;0.047529000;0.000000000
12;2;normalisation;0.082979193;0.052978000;0.049661000;0.003317000
13;1;normalisation;0.091366804;0.055490000;0.048941000;0.006549000
13;2;decoupage;0.079342845;0.048232000;0.048232000;0.000000000
14;1;decoupage;0.073351969;0.049378000;0.046080000;0.003298000
14;2;normalisation;0.082174939;0.056187000;0.056187000;0.000000000
15;1;normalisation;0.100514947;0.073726000;0.067040000;0.006686000
15;2;decoupage;0.107643859;0.077912000;0.077912000;0.000000000
16;1;decoupage;0.071424612;0.047602000;0.047602000;0.000000000
16;2;normalisation;0.080502181;0.054009000;0.054009000;0.000000000
17;1;normalisation;0.080461308;0.052988000;0.052988000;0.000000000
17;2;decoupage;0.072877468;0.047245000;0.047245000;0.000000000
18;1;decoupage;0.067525437;0.047622000;0.044458000;0.003164000
18;2;normalisation;0.076900013;0.052838000;0.049726000;0.003112000
19;1;normalisation;0.084867661;0.053998000;0.053998000;0.000000000
19;2;decoupage;0.074569286;0.048463000;0.045426000;0.003037000
20;1;decoupage;0.080500195;0.048442000;0.041979000;0.006463000
20;2;normalisation;0.089638558;0.060543000;0.057370000;0.003173000
21;1;normalisation;0.077757425;0.053577000;0.050414000;0.003163000
21;2;decoupage;0.079858479;0.048311000;0.041903000;0.006408000
22;1;decoupage;0.076939251;0.049027000;0.045759000;0.003268000
22;2;normalisation;0.082923503;0.054112000;0.054112000;0.000000000
23;1;normalisation;0.082431887;0.056499000;0.056499000;0.000000000
23;2;decoupage;0.075330615;0.048884000;0.048884000;0.000000000
24;1;decoupage;0.076024610;0.048309000;0.048309000;0.000000000
24;2;normalisation;0.084193587;0.054436000;0.054436000;0.000000000
25;1;normalisation;0.088893697;0.054852000;0.048409000;0.006443000
25;2;decoupage;0.074862850;0.048490000;0.048490000;0.000000000
26;1;decoupage;0.081130698;0.048161000;0.048161000;0.000000000
26;2;normalisation;0.119043098;0.087924000;0.078516000;0.009408000
27;1;normalisation;0.078182844;0.053847000;0.053847000;0.000000000
27;2;decoupage;0.074151354;0.048917000;0.048917000;0.000000000
28;1;decoupage;0.075701689;0.049406000;0.049406000;0.000000000
28;2;normalisation;0.083841894;0.055895000;0.052957000;0.002938000
29;1;normalisation;0.085386498;0.054614000;0.054614000;0.000000000
29;2;decoupage;0.118421751;0.084560000;0.078032000;0.006528000
30;1;decoupage;0.110804120;0.075276000;0.075276000;0.000000000
30;2;normalisation;0.096160804;0.058503000;0.058503000;0.000000000
31;1;normalisation;0.084021302;0.058931000;0.055848000;0.003083000
31;2;decoupage;0.101838876;0.075659000;0.065788000;0.009871000
32;1;decoupage;0.103077891;0.075699000;0.069127000;0.006572000
32;2;normalisation;0.078340598;0.052816000;0.043481000;0.009335000
33;1;normalisation;0.077510008;0.054685000;0.054685000;0.000000000
33;2;decoupage;0.075927998;0.048442000;0.045406000;0.003036000
34;1;decoupage;0.085126298;0.049132000;0.049132000;0.000000000
34;2;normalisation;0.086433030;0.058404000;0.058404000;0.000000000
35;1;normalisation;0.079036812;0.053484000;0.053484000;0.000000000
35;2;decoupage;0.074087800;0.047513000;0.044337000;0.003176000
36;1;decoupage;0.076034234;0.046593000;0.046593000;0.000000000
36;2;normalisation;0.080232906;0.053331000;0.049986000;0.003345000
37;1;normalisation;0.080259313;0.052903000;0.052903000;0.000000000
37;2;decoupage;0.078727491;0.048263000;0.048263000;0.000000000
38;1;decoupage;0.082345265;0.048775000;0.045511000;0.003264000
38;2;normalisation;0.085401830;0.053081000;0.046822000;0.006259000
39;1;normalisation;0.087125157;0.054045000;0.050672000;0.003373000
39;2;decoupage;0.085990699;0.052955000;0.049640000;0.003315000
40;1;decoupage;0.095500738;0.062192000;0.059158000;0.003034000
40;2;normalisation;0.081692650;0.054493000;0.051075000;0.003418000
41;1;normalisation;0.083779548;0.053721000;0.050554000;0.003167000
41;2;decoupage;0.107384460;0.079632000;0.079632000;0.000000000
42;1;decoupage;0.077822528;0.049391000;0.046097000;0.003294000
42;2;normalisation;0.091810990;0.054198000;0.051011000;0.003187000
43;1;normalisation;0.118135004;0.086285000;0.082959000;0.003326000
43;2;decoupage;0.109951491;0.076873000;0.073542000;0.003331000
44;1;decoupage;0.091871545;0.063580000;0.060232000;0.003348000
44;2;normalisation;0.089916762;0.054942000;0.051507000;0.003435000
45;1;normalisation;0.088390574;0.056449000;0.056449000;0.000000000
45;2;decoupage;0.088286201;0.051874000;0.051874000;0.000000000
46;1;decoupage;0.107611359;0.080214000;0.076995000;0.003219000
46;2;normalisation;0.081143835;0.053834000;0.053834000;0.000000000
47;1;normalisation;0.116520885;0.088303000;0.078827000;0.009476000
47;2;decoupage;0.078122386;0.051368000;0.048164000;0.003204000
48;1;decoupage;0.075640486;0.048041000;0.044831000;0.003210000
48;2;normalisation;0.085947676;0.055347000;0.048823000;0.006524000
49;1;normalisation;0.111680766;0.085783000;0.079436000;0.006347000
49;2;decoupage;0.116693463;0.079256000;0.079256000;0.000000000
50;1;decoupage;0.091055658;0.055567000;0.052477000;0.003090000
50;2;normalisation;0.080353565;0.054549000;0.054549000;0.000000000
1 paire ordre version reel_s cpu_s utilisateur_s systeme_s
2 1 1 normalisation 0.098564077 0.066697000 0.063348000 0.003349000
3 1 2 decoupage 0.077939649 0.049954000 0.046830000 0.003124000
4 2 1 decoupage 0.079878005 0.049596000 0.049596000 0.000000000
5 2 2 normalisation 0.086629509 0.057711000 0.057711000 0.000000000
6 3 1 normalisation 0.086206658 0.054246000 0.054246000 0.000000000
7 3 2 decoupage 0.077741974 0.048682000 0.045429000 0.003253000
8 4 1 decoupage 0.076489187 0.050586000 0.050586000 0.000000000
9 4 2 normalisation 0.081969255 0.055426000 0.048897000 0.006529000
10 5 1 normalisation 0.084525585 0.055295000 0.055295000 0.000000000
11 5 2 decoupage 0.082314577 0.050980000 0.050980000 0.000000000
12 6 1 decoupage 0.086664939 0.050787000 0.050787000 0.000000000
13 6 2 normalisation 0.091178679 0.059710000 0.059710000 0.000000000
14 7 1 normalisation 0.122270653 0.091533000 0.084745000 0.006788000
15 7 2 decoupage 0.088566138 0.059787000 0.056466000 0.003321000
16 8 1 decoupage 0.074593149 0.048882000 0.045816000 0.003066000
17 8 2 normalisation 0.082676622 0.054373000 0.050965000 0.003408000
18 9 1 normalisation 0.077770477 0.052938000 0.049816000 0.003122000
19 9 2 decoupage 0.081749320 0.050059000 0.046735000 0.003324000
20 10 1 decoupage 0.107211398 0.080546000 0.077318000 0.003228000
21 10 2 normalisation 0.079203746 0.054812000 0.054812000 0.000000000
22 11 1 normalisation 0.107278623 0.081262000 0.077865000 0.003397000
23 11 2 decoupage 0.074858666 0.047378000 0.047378000 0.000000000
24 12 1 decoupage 0.074898321 0.047529000 0.047529000 0.000000000
25 12 2 normalisation 0.082979193 0.052978000 0.049661000 0.003317000
26 13 1 normalisation 0.091366804 0.055490000 0.048941000 0.006549000
27 13 2 decoupage 0.079342845 0.048232000 0.048232000 0.000000000
28 14 1 decoupage 0.073351969 0.049378000 0.046080000 0.003298000
29 14 2 normalisation 0.082174939 0.056187000 0.056187000 0.000000000
30 15 1 normalisation 0.100514947 0.073726000 0.067040000 0.006686000
31 15 2 decoupage 0.107643859 0.077912000 0.077912000 0.000000000
32 16 1 decoupage 0.071424612 0.047602000 0.047602000 0.000000000
33 16 2 normalisation 0.080502181 0.054009000 0.054009000 0.000000000
34 17 1 normalisation 0.080461308 0.052988000 0.052988000 0.000000000
35 17 2 decoupage 0.072877468 0.047245000 0.047245000 0.000000000
36 18 1 decoupage 0.067525437 0.047622000 0.044458000 0.003164000
37 18 2 normalisation 0.076900013 0.052838000 0.049726000 0.003112000
38 19 1 normalisation 0.084867661 0.053998000 0.053998000 0.000000000
39 19 2 decoupage 0.074569286 0.048463000 0.045426000 0.003037000
40 20 1 decoupage 0.080500195 0.048442000 0.041979000 0.006463000
41 20 2 normalisation 0.089638558 0.060543000 0.057370000 0.003173000
42 21 1 normalisation 0.077757425 0.053577000 0.050414000 0.003163000
43 21 2 decoupage 0.079858479 0.048311000 0.041903000 0.006408000
44 22 1 decoupage 0.076939251 0.049027000 0.045759000 0.003268000
45 22 2 normalisation 0.082923503 0.054112000 0.054112000 0.000000000
46 23 1 normalisation 0.082431887 0.056499000 0.056499000 0.000000000
47 23 2 decoupage 0.075330615 0.048884000 0.048884000 0.000000000
48 24 1 decoupage 0.076024610 0.048309000 0.048309000 0.000000000
49 24 2 normalisation 0.084193587 0.054436000 0.054436000 0.000000000
50 25 1 normalisation 0.088893697 0.054852000 0.048409000 0.006443000
51 25 2 decoupage 0.074862850 0.048490000 0.048490000 0.000000000
52 26 1 decoupage 0.081130698 0.048161000 0.048161000 0.000000000
53 26 2 normalisation 0.119043098 0.087924000 0.078516000 0.009408000
54 27 1 normalisation 0.078182844 0.053847000 0.053847000 0.000000000
55 27 2 decoupage 0.074151354 0.048917000 0.048917000 0.000000000
56 28 1 decoupage 0.075701689 0.049406000 0.049406000 0.000000000
57 28 2 normalisation 0.083841894 0.055895000 0.052957000 0.002938000
58 29 1 normalisation 0.085386498 0.054614000 0.054614000 0.000000000
59 29 2 decoupage 0.118421751 0.084560000 0.078032000 0.006528000
60 30 1 decoupage 0.110804120 0.075276000 0.075276000 0.000000000
61 30 2 normalisation 0.096160804 0.058503000 0.058503000 0.000000000
62 31 1 normalisation 0.084021302 0.058931000 0.055848000 0.003083000
63 31 2 decoupage 0.101838876 0.075659000 0.065788000 0.009871000
64 32 1 decoupage 0.103077891 0.075699000 0.069127000 0.006572000
65 32 2 normalisation 0.078340598 0.052816000 0.043481000 0.009335000
66 33 1 normalisation 0.077510008 0.054685000 0.054685000 0.000000000
67 33 2 decoupage 0.075927998 0.048442000 0.045406000 0.003036000
68 34 1 decoupage 0.085126298 0.049132000 0.049132000 0.000000000
69 34 2 normalisation 0.086433030 0.058404000 0.058404000 0.000000000
70 35 1 normalisation 0.079036812 0.053484000 0.053484000 0.000000000
71 35 2 decoupage 0.074087800 0.047513000 0.044337000 0.003176000
72 36 1 decoupage 0.076034234 0.046593000 0.046593000 0.000000000
73 36 2 normalisation 0.080232906 0.053331000 0.049986000 0.003345000
74 37 1 normalisation 0.080259313 0.052903000 0.052903000 0.000000000
75 37 2 decoupage 0.078727491 0.048263000 0.048263000 0.000000000
76 38 1 decoupage 0.082345265 0.048775000 0.045511000 0.003264000
77 38 2 normalisation 0.085401830 0.053081000 0.046822000 0.006259000
78 39 1 normalisation 0.087125157 0.054045000 0.050672000 0.003373000
79 39 2 decoupage 0.085990699 0.052955000 0.049640000 0.003315000
80 40 1 decoupage 0.095500738 0.062192000 0.059158000 0.003034000
81 40 2 normalisation 0.081692650 0.054493000 0.051075000 0.003418000
82 41 1 normalisation 0.083779548 0.053721000 0.050554000 0.003167000
83 41 2 decoupage 0.107384460 0.079632000 0.079632000 0.000000000
84 42 1 decoupage 0.077822528 0.049391000 0.046097000 0.003294000
85 42 2 normalisation 0.091810990 0.054198000 0.051011000 0.003187000
86 43 1 normalisation 0.118135004 0.086285000 0.082959000 0.003326000
87 43 2 decoupage 0.109951491 0.076873000 0.073542000 0.003331000
88 44 1 decoupage 0.091871545 0.063580000 0.060232000 0.003348000
89 44 2 normalisation 0.089916762 0.054942000 0.051507000 0.003435000
90 45 1 normalisation 0.088390574 0.056449000 0.056449000 0.000000000
91 45 2 decoupage 0.088286201 0.051874000 0.051874000 0.000000000
92 46 1 decoupage 0.107611359 0.080214000 0.076995000 0.003219000
93 46 2 normalisation 0.081143835 0.053834000 0.053834000 0.000000000
94 47 1 normalisation 0.116520885 0.088303000 0.078827000 0.009476000
95 47 2 decoupage 0.078122386 0.051368000 0.048164000 0.003204000
96 48 1 decoupage 0.075640486 0.048041000 0.044831000 0.003210000
97 48 2 normalisation 0.085947676 0.055347000 0.048823000 0.006524000
98 49 1 normalisation 0.111680766 0.085783000 0.079436000 0.006347000
99 49 2 decoupage 0.116693463 0.079256000 0.079256000 0.000000000
100 50 1 decoupage 0.091055658 0.055567000 0.052477000 0.003090000
101 50 2 normalisation 0.080353565 0.054549000 0.054549000 0.000000000
@@ -0,0 +1,95 @@
{
"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": "875af6fe9eaee7a2a9a997c7fe4102d216a1b9fb",
"chemin_source": "src/analyseur.c",
"source_sha256": {
"normalisation": "fa529c2b8589dbceda26c40eae2019648cc56785c6462e61b70dac8cfe1a2d01",
"decoupage": "1d43a007a7298d5ca1b1cbdf7a53f2e9ce6eb58196d29f3a38ceb0e04fe4e8e0"
},
"chauffe_par_version": 5,
"mesures_par_version": 50,
"executions_verifiees": 110,
"horloge_reelle": "time.perf_counter, lancement et attente du processus inclus",
"quartiles": "statistics.quantiles(method=\"inclusive\")",
"empreinte_rapport": "1d53de903efd2b7c",
"allocations_contenu_lignes": {
"normalisation": 21746,
"decoupage": 0
},
"octets_alloues_contenu_lignes": {
"normalisation": 1561330,
"decoupage": 0
},
"normalisation": {
"reel_s": {
"mediane": 0.08435958599989135,
"q1": 0.08066259450015423,
"q3": 0.0898472110000057,
"min": 0.0769000129998858,
"max": 0.12227065299975948
},
"cpu_s": {
"mediane": 0.0547485,
"q1": 0.053884749999999995,
"q3": 0.05823075,
"min": 0.052816,
"max": 0.091533
},
"rss_max_kio": {
"mediane": 6688,
"q1": 6688.0,
"q3": 6692.0,
"min": 6676,
"max": 6692
}
},
"decoupage": {
"reel_s": {
"mediane": 0.07960066200007532,
"q1": 0.07565578674984863,
"q3": 0.09043327800020506,
"min": 0.06752543699985836,
"max": 0.11842175099991437
},
"cpu_s": {
"mediane": 0.0493845,
"q1": 0.04834374999999999,
"q3": 0.058732,
"min": 0.046592999999999996,
"max": 0.08456
},
"rss_max_kio": {
"mediane": 4896,
"q1": 4884.0,
"q3": 4900.0,
"min": 4880,
"max": 4900
}
},
"gain_reel_pourcent": 5.641236788220083,
"gain_cpu_pourcent": 9.797528699416425,
"paires_plus_rapides": {
"reel_s": 36,
"cpu_s": 39
},
"mesure_cpu": "os.wait4 : ru_utime + ru_stime du processus fils",
"mesure_memoire": {
"methode": "/usr/bin/time -f %M, dans une série distincte sur le même CPU",
"mesures_par_version": 5,
"fichier": "comparaison_decoupage_memoire.csv",
"note": "Le ru_maxrss du lancement direct depuis Python héritait de son pic mémoire (21 420 Kio) ; il a été écarté au profit du processus fils de GNU time."
},
"executions_verifiees_memoire": 10,
"repertoire_execution": "build/verification_decoupage_arnsavcd"
}
@@ -0,0 +1,11 @@
paire;ordre;version;rss_max_kio
1;1;normalisation;6688
1;2;decoupage;4900
2;1;decoupage;4896
2;2;normalisation;6692
3;1;normalisation;6692
3;2;decoupage;4900
4;1;decoupage;4884
4;2;normalisation;6688
5;1;normalisation;6676
5;2;decoupage;4880
1 paire ordre version rss_max_kio
2 1 1 normalisation 6688
3 1 2 decoupage 4900
4 2 1 decoupage 4896
5 2 2 normalisation 6692
6 3 1 normalisation 6692
7 3 2 decoupage 4900
8 4 1 decoupage 4884
9 4 2 normalisation 6688
10 5 1 normalisation 6676
11 5 2 decoupage 4880
@@ -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
+158
View File
@@ -0,0 +1,158 @@
Flat profile:
Each sample counts as 0.01 seconds.
% cumulative self self total
time seconds seconds calls ms/call ms/call name
14.29 0.01 0.01 250000 0.00 0.00 est_mot_vide
14.29 0.02 0.01 150182 0.00 0.00 chercher_mot
14.29 0.03 0.01 150182 0.00 0.00 compter_mot
14.29 0.04 0.01 21746 0.00 0.00 compter_mots_ligne
14.29 0.05 0.01 1 10.00 10.00 analyser_bigrammes
14.29 0.06 0.01 1 10.00 10.00 decouper_lignes
14.29 0.07 0.01 1 10.00 10.00 generer_texte
0.00 0.07 0.00 928117 0.00 0.00 alea
0.00 0.07 0.00 355573 0.00 0.00 egales
0.00 0.07 0.00 293223 0.00 0.00 hacher_mot
0.00 0.07 0.00 129602 0.00 0.00 doit_echanger
0.00 0.07 0.00 32813 0.00 0.00 comparer
0.00 0.07 0.00 26801 0.00 0.00 ajouter
0.00 0.07 0.00 21746 0.00 0.00 normaliser_ligne
0.00 0.07 0.00 8798 0.00 0.00 retablir_tas
0.00 0.07 0.00 5866 0.00 0.00 copier
0.00 0.07 0.00 1 0.00 0.00 construire_rapport
0.00 0.07 0.00 1 0.00 0.00 ecart_type_longueur
0.00 0.07 0.00 1 0.00 0.00 empreinte
0.00 0.07 0.00 1 0.00 0.00 generer_vocabulaire
0.00 0.07 0.00 1 0.00 0.00 initialiser_mots_vides
0.00 0.07 0.00 1 0.00 0.00 longueur_moyenne
0.00 0.07 0.00 1 0.00 0.00 racine
0.00 0.07 0.00 1 0.00 0.00 trier_entrees
Call graph
granularity: each sample hit covers 4 byte(s) for 14.29% of 0.07 seconds
index % time self children called name
<spontaneous>
[1] 100.0 0.00 0.07 main [1]
0.01 0.03 21746/21746 compter_mots_ligne [2]
0.01 0.00 1/1 generer_texte [8]
0.01 0.00 1/1 decouper_lignes [7]
0.01 0.00 1/1 analyser_bigrammes [6]
0.00 0.00 21746/21746 normaliser_ligne [15]
0.00 0.00 1/1 generer_vocabulaire [21]
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 [19]
0.00 0.00 1/1 racine [24]
0.00 0.00 1/1 construire_rapport [18]
0.00 0.00 1/1 empreinte [20]
-----------------------------------------------
0.01 0.03 21746/21746 main [1]
[2] 57.1 0.01 0.03 21746 compter_mots_ligne [2]
0.01 0.01 150182/150182 compter_mot [3]
0.01 0.00 250000/250000 est_mot_vide [4]
-----------------------------------------------
0.01 0.01 150182/150182 compter_mots_ligne [2]
[3] 28.6 0.01 0.01 150182 compter_mot [3]
0.01 0.00 150182/150182 chercher_mot [5]
0.00 0.00 5866/5866 copier [17]
-----------------------------------------------
0.01 0.00 250000/250000 compter_mots_ligne [2]
[4] 14.3 0.01 0.00 250000 est_mot_vide [4]
0.00 0.00 202444/355573 egales [10]
0.00 0.00 142981/293223 hacher_mot [11]
0.00 0.00 1/1 initialiser_mots_vides [22]
-----------------------------------------------
0.01 0.00 150182/150182 compter_mot [3]
[5] 14.3 0.01 0.00 150182 chercher_mot [5]
0.00 0.00 153101/355573 egales [10]
0.00 0.00 150182/293223 hacher_mot [11]
-----------------------------------------------
0.01 0.00 1/1 main [1]
[6] 14.3 0.01 0.00 1 analyser_bigrammes [6]
-----------------------------------------------
0.01 0.00 1/1 main [1]
[7] 14.3 0.01 0.00 1 decouper_lignes [7]
-----------------------------------------------
0.01 0.00 1/1 main [1]
[8] 14.3 0.01 0.00 1 generer_texte [8]
0.00 0.00 900183/928117 alea [9]
-----------------------------------------------
0.00 0.00 27934/928117 generer_vocabulaire [21]
0.00 0.00 900183/928117 generer_texte [8]
[9] 0.0 0.00 0.00 928117 alea [9]
-----------------------------------------------
0.00 0.00 28/355573 initialiser_mots_vides [22]
0.00 0.00 153101/355573 chercher_mot [5]
0.00 0.00 202444/355573 est_mot_vide [4]
[10] 0.0 0.00 0.00 355573 egales [10]
-----------------------------------------------
0.00 0.00 60/293223 initialiser_mots_vides [22]
0.00 0.00 142981/293223 est_mot_vide [4]
0.00 0.00 150182/293223 chercher_mot [5]
[11] 0.0 0.00 0.00 293223 hacher_mot [11]
-----------------------------------------------
0.00 0.00 129602/129602 retablir_tas [16]
[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 [18]
0.00 0.00 20934/26801 generer_vocabulaire [21]
[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 normaliser_ligne [15]
-----------------------------------------------
0.00 0.00 8798/8798 trier_entrees [25]
[16] 0.0 0.00 0.00 8798 retablir_tas [16]
0.00 0.00 129602/129602 doit_echanger [12]
-----------------------------------------------
0.00 0.00 5866/5866 compter_mot [3]
[17] 0.0 0.00 0.00 5866 copier [17]
-----------------------------------------------
0.00 0.00 1/1 main [1]
[18] 0.0 0.00 0.00 1 construire_rapport [18]
0.00 0.00 5867/26801 ajouter [14]
-----------------------------------------------
0.00 0.00 1/1 main [1]
[19] 0.0 0.00 0.00 1 ecart_type_longueur [19]
-----------------------------------------------
0.00 0.00 1/1 main [1]
[20] 0.0 0.00 0.00 1 empreinte [20]
-----------------------------------------------
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 [9]
0.00 0.00 20934/26801 ajouter [14]
-----------------------------------------------
0.00 0.00 1/1 est_mot_vide [4]
[22] 0.0 0.00 0.00 1 initialiser_mots_vides [22]
0.00 0.00 60/293223 hacher_mot [11]
0.00 0.00 28/355573 egales [10]
-----------------------------------------------
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 [16]
-----------------------------------------------
Index by function name
[14] ajouter [17] copier [21] generer_vocabulaire
[9] alea [7] decouper_lignes [11] hacher_mot
[6] analyser_bigrammes [12] doit_echanger [22] initialiser_mots_vides
[5] chercher_mot [19] ecart_type_longueur [23] longueur_moyenne
[13] comparer [10] egales [15] normaliser_ligne
[3] compter_mot [20] empreinte [24] racine
[2] compter_mots_ligne [4] est_mot_vide [16] retablir_tas
[18] construire_rapport [8] generer_texte [25] trier_entrees
@@ -0,0 +1,163 @@
Flat profile:
Each sample counts as 0.01 seconds.
% cumulative self self total
time seconds seconds calls ms/call ms/call name
20.38 0.32 0.32 1 320.00 329.99 generer_texte
17.83 0.60 0.28 1 280.00 280.00 analyser_bigrammes
10.83 0.77 0.17 14463795 0.00 0.00 egales
10.19 0.93 0.16 869827 0.00 0.00 compter_mots_ligne
8.92 1.07 0.14 869827 0.00 0.00 normaliser_ligne
7.64 1.19 0.12 11729593 0.00 0.00 hacher_mot
7.64 1.31 0.12 5998884 0.00 0.00 chercher_mot
7.64 1.43 0.12 1 120.00 120.00 decouper_lignes
5.10 1.51 0.08 10000000 0.00 0.00 est_mot_vide
1.91 1.54 0.03 5998884 0.00 0.00 compter_mot
1.27 1.56 0.02 _init
0.64 1.57 0.01 36026819 0.00 0.00 alea
0.00 1.57 0.00 135315 0.00 0.00 doit_echanger
0.00 1.57 0.00 27033 0.00 0.00 ajouter
0.00 1.57 0.00 9146 0.00 0.00 retablir_tas
0.00 1.57 0.00 6706 0.00 0.00 comparer
0.00 1.57 0.00 6098 0.00 0.00 copier
0.00 1.57 0.00 1 0.00 0.00 construire_rapport
0.00 1.57 0.00 1 0.00 0.00 ecart_type_longueur
0.00 1.57 0.00 1 0.00 0.00 empreinte
0.00 1.57 0.00 1 0.00 0.01 generer_vocabulaire
0.00 1.57 0.00 1 0.00 0.00 initialiser_mots_vides
0.00 1.57 0.00 1 0.00 0.00 longueur_moyenne
0.00 1.57 0.00 1 0.00 0.00 racine
0.00 1.57 0.00 1 0.00 0.00 trier_entrees
Call graph
granularity: each sample hit covers 4 byte(s) for 0.64% of 1.57 seconds
index % time self children called name
<spontaneous>
[1] 98.7 0.00 1.55 main [1]
0.16 0.52 869827/869827 compter_mots_ligne [2]
0.32 0.01 1/1 generer_texte [3]
0.28 0.00 1/1 analyser_bigrammes [5]
0.14 0.00 869827/869827 normaliser_ligne [9]
0.12 0.00 1/1 decouper_lignes [11]
0.00 0.00 1/1 generer_vocabulaire [14]
0.00 0.00 1/1 trier_entrees [26]
0.00 0.00 1/1 longueur_moyenne [24]
0.00 0.00 1/1 ecart_type_longueur [22]
0.00 0.00 1/1 racine [25]
0.00 0.00 1/1 construire_rapport [21]
0.00 0.00 1/1 empreinte [23]
-----------------------------------------------
0.16 0.52 869827/869827 main [1]
[2] 43.3 0.16 0.52 869827 compter_mots_ligne [2]
0.03 0.26 5998884/5998884 compter_mot [4]
0.08 0.15 10000000/10000000 est_mot_vide [7]
-----------------------------------------------
0.32 0.01 1/1 main [1]
[3] 21.0 0.32 0.01 1 generer_texte [3]
0.01 0.00 35998885/36026819 alea [13]
-----------------------------------------------
0.03 0.26 5998884/5998884 compter_mots_ligne [2]
[4] 18.2 0.03 0.26 5998884 compter_mot [4]
0.12 0.14 5998884/5998884 chercher_mot [6]
0.00 0.00 6098/6098 copier [20]
-----------------------------------------------
0.28 0.00 1/1 main [1]
[5] 17.8 0.28 0.00 1 analyser_bigrammes [5]
-----------------------------------------------
0.12 0.14 5998884/5998884 compter_mot [4]
[6] 16.3 0.12 0.14 5998884 chercher_mot [6]
0.07 0.00 6347060/14463795 egales [8]
0.06 0.00 5998884/11729593 hacher_mot [10]
-----------------------------------------------
0.08 0.15 10000000/10000000 compter_mots_ligne [2]
[7] 14.9 0.08 0.15 10000000 est_mot_vide [7]
0.10 0.00 8116707/14463795 egales [8]
0.06 0.00 5730649/11729593 hacher_mot [10]
0.00 0.00 1/1 initialiser_mots_vides [15]
-----------------------------------------------
0.00 0.00 28/14463795 initialiser_mots_vides [15]
0.07 0.00 6347060/14463795 chercher_mot [6]
0.10 0.00 8116707/14463795 est_mot_vide [7]
[8] 10.8 0.17 0.00 14463795 egales [8]
-----------------------------------------------
0.14 0.00 869827/869827 main [1]
[9] 8.9 0.14 0.00 869827 normaliser_ligne [9]
-----------------------------------------------
0.00 0.00 60/11729593 initialiser_mots_vides [15]
0.06 0.00 5730649/11729593 est_mot_vide [7]
0.06 0.00 5998884/11729593 chercher_mot [6]
[10] 7.6 0.12 0.00 11729593 hacher_mot [10]
-----------------------------------------------
0.12 0.00 1/1 main [1]
[11] 7.6 0.12 0.00 1 decouper_lignes [11]
-----------------------------------------------
<spontaneous>
[12] 1.3 0.02 0.00 _init [12]
-----------------------------------------------
0.00 0.00 27934/36026819 generer_vocabulaire [14]
0.01 0.00 35998885/36026819 generer_texte [3]
[13] 0.6 0.01 0.00 36026819 alea [13]
-----------------------------------------------
0.00 0.00 1/1 main [1]
[14] 0.0 0.00 0.00 1 generer_vocabulaire [14]
0.00 0.00 27934/36026819 alea [13]
0.00 0.00 20934/27033 ajouter [17]
-----------------------------------------------
0.00 0.00 1/1 est_mot_vide [7]
[15] 0.0 0.00 0.00 1 initialiser_mots_vides [15]
0.00 0.00 60/11729593 hacher_mot [10]
0.00 0.00 28/14463795 egales [8]
-----------------------------------------------
0.00 0.00 135315/135315 retablir_tas [18]
[16] 0.0 0.00 0.00 135315 doit_echanger [16]
0.00 0.00 6706/6706 comparer [19]
-----------------------------------------------
0.00 0.00 6099/27033 construire_rapport [21]
0.00 0.00 20934/27033 generer_vocabulaire [14]
[17] 0.0 0.00 0.00 27033 ajouter [17]
-----------------------------------------------
0.00 0.00 9146/9146 trier_entrees [26]
[18] 0.0 0.00 0.00 9146 retablir_tas [18]
0.00 0.00 135315/135315 doit_echanger [16]
-----------------------------------------------
0.00 0.00 6706/6706 doit_echanger [16]
[19] 0.0 0.00 0.00 6706 comparer [19]
-----------------------------------------------
0.00 0.00 6098/6098 compter_mot [4]
[20] 0.0 0.00 0.00 6098 copier [20]
-----------------------------------------------
0.00 0.00 1/1 main [1]
[21] 0.0 0.00 0.00 1 construire_rapport [21]
0.00 0.00 6099/27033 ajouter [17]
-----------------------------------------------
0.00 0.00 1/1 main [1]
[22] 0.0 0.00 0.00 1 ecart_type_longueur [22]
-----------------------------------------------
0.00 0.00 1/1 main [1]
[23] 0.0 0.00 0.00 1 empreinte [23]
-----------------------------------------------
0.00 0.00 1/1 main [1]
[24] 0.0 0.00 0.00 1 longueur_moyenne [24]
-----------------------------------------------
0.00 0.00 1/1 main [1]
[25] 0.0 0.00 0.00 1 racine [25]
-----------------------------------------------
0.00 0.00 1/1 main [1]
[26] 0.0 0.00 0.00 1 trier_entrees [26]
0.00 0.00 9146/9146 retablir_tas [18]
-----------------------------------------------
Index by function name
[12] _init [20] copier [10] hacher_mot
[17] ajouter [11] decouper_lignes [15] initialiser_mots_vides
[13] alea [16] doit_echanger [24] longueur_moyenne
[5] analyser_bigrammes [22] ecart_type_longueur [9] normaliser_ligne
[6] chercher_mot [8] egales [25] racine
[19] comparer [23] empreinte [18] retablir_tas
[4] compter_mot [7] est_mot_vide [26] trier_entrees
[2] compter_mots_ligne [3] generer_texte
[21] construire_rapport [14] generer_vocabulaire
@@ -0,0 +1,160 @@
Flat profile:
Each sample counts as 0.01 seconds.
% cumulative self self total
time seconds seconds calls ms/call ms/call name
17.58 0.29 0.29 1 290.00 290.00 analyser_bigrammes
16.97 0.57 0.28 1 280.00 280.00 decouper_lignes
13.94 0.80 0.23 869827 0.00 0.00 compter_mots_ligne
13.33 1.02 0.22 1 220.00 259.97 generer_texte
12.73 1.23 0.21 14463795 0.00 0.00 egales
6.67 1.34 0.11 869827 0.00 0.00 normaliser_ligne
4.85 1.42 0.08 11729593 0.00 0.00 hacher_mot
4.24 1.49 0.07 5998884 0.00 0.00 chercher_mot
3.33 1.54 0.06 10000000 0.00 0.00 est_mot_vide
2.42 1.58 0.04 36026819 0.00 0.00 alea
2.42 1.62 0.04 5998884 0.00 0.00 compter_mot
1.21 1.65 0.02 main
0.30 1.65 0.01 1 5.00 5.00 initialiser_mots_vides
0.00 1.65 0.00 135315 0.00 0.00 doit_echanger
0.00 1.65 0.00 27033 0.00 0.00 ajouter
0.00 1.65 0.00 9146 0.00 0.00 retablir_tas
0.00 1.65 0.00 6706 0.00 0.00 comparer
0.00 1.65 0.00 6098 0.00 0.00 copier
0.00 1.65 0.00 1 0.00 0.00 construire_rapport
0.00 1.65 0.00 1 0.00 0.00 ecart_type_longueur
0.00 1.65 0.00 1 0.00 0.00 empreinte
0.00 1.65 0.00 1 0.00 0.03 generer_vocabulaire
0.00 1.65 0.00 1 0.00 0.00 longueur_moyenne
0.00 1.65 0.00 1 0.00 0.00 racine
0.00 1.65 0.00 1 0.00 0.00 trier_entrees
Call graph
granularity: each sample hit covers 4 byte(s) for 0.61% of 1.65 seconds
index % time self children called name
<spontaneous>
[1] 100.0 0.02 1.63 main [1]
0.23 0.46 869827/869827 compter_mots_ligne [2]
0.29 0.00 1/1 analyser_bigrammes [3]
0.28 0.00 1/1 decouper_lignes [4]
0.22 0.04 1/1 generer_texte [5]
0.11 0.00 869827/869827 normaliser_ligne [10]
0.00 0.00 1/1 generer_vocabulaire [14]
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 [21]
0.00 0.00 1/1 racine [24]
0.00 0.00 1/1 construire_rapport [20]
0.00 0.00 1/1 empreinte [22]
-----------------------------------------------
0.23 0.46 869827/869827 main [1]
[2] 41.8 0.23 0.46 869827 compter_mots_ligne [2]
0.04 0.20 5998884/5998884 compter_mot [6]
0.06 0.16 10000000/10000000 est_mot_vide [7]
-----------------------------------------------
0.29 0.00 1/1 main [1]
[3] 17.6 0.29 0.00 1 analyser_bigrammes [3]
-----------------------------------------------
0.28 0.00 1/1 main [1]
[4] 17.0 0.28 0.00 1 decouper_lignes [4]
-----------------------------------------------
0.22 0.04 1/1 main [1]
[5] 15.8 0.22 0.04 1 generer_texte [5]
0.04 0.00 35998885/36026819 alea [12]
-----------------------------------------------
0.04 0.20 5998884/5998884 compter_mots_ligne [2]
[6] 14.7 0.04 0.20 5998884 compter_mot [6]
0.07 0.13 5998884/5998884 chercher_mot [9]
0.00 0.00 6098/6098 copier [19]
-----------------------------------------------
0.06 0.16 10000000/10000000 compter_mots_ligne [2]
[7] 13.1 0.06 0.16 10000000 est_mot_vide [7]
0.12 0.00 8116707/14463795 egales [8]
0.04 0.00 5730649/11729593 hacher_mot [11]
0.01 0.00 1/1 initialiser_mots_vides [13]
-----------------------------------------------
0.00 0.00 28/14463795 initialiser_mots_vides [13]
0.09 0.00 6347060/14463795 chercher_mot [9]
0.12 0.00 8116707/14463795 est_mot_vide [7]
[8] 12.7 0.21 0.00 14463795 egales [8]
-----------------------------------------------
0.07 0.13 5998884/5998884 compter_mot [6]
[9] 12.3 0.07 0.13 5998884 chercher_mot [9]
0.09 0.00 6347060/14463795 egales [8]
0.04 0.00 5998884/11729593 hacher_mot [11]
-----------------------------------------------
0.11 0.00 869827/869827 main [1]
[10] 6.7 0.11 0.00 869827 normaliser_ligne [10]
-----------------------------------------------
0.00 0.00 60/11729593 initialiser_mots_vides [13]
0.04 0.00 5730649/11729593 est_mot_vide [7]
0.04 0.00 5998884/11729593 chercher_mot [9]
[11] 4.8 0.08 0.00 11729593 hacher_mot [11]
-----------------------------------------------
0.00 0.00 27934/36026819 generer_vocabulaire [14]
0.04 0.00 35998885/36026819 generer_texte [5]
[12] 2.4 0.04 0.00 36026819 alea [12]
-----------------------------------------------
0.01 0.00 1/1 est_mot_vide [7]
[13] 0.3 0.01 0.00 1 initialiser_mots_vides [13]
0.00 0.00 60/11729593 hacher_mot [11]
0.00 0.00 28/14463795 egales [8]
-----------------------------------------------
0.00 0.00 1/1 main [1]
[14] 0.0 0.00 0.00 1 generer_vocabulaire [14]
0.00 0.00 27934/36026819 alea [12]
0.00 0.00 20934/27033 ajouter [16]
-----------------------------------------------
0.00 0.00 135315/135315 retablir_tas [17]
[15] 0.0 0.00 0.00 135315 doit_echanger [15]
0.00 0.00 6706/6706 comparer [18]
-----------------------------------------------
0.00 0.00 6099/27033 construire_rapport [20]
0.00 0.00 20934/27033 generer_vocabulaire [14]
[16] 0.0 0.00 0.00 27033 ajouter [16]
-----------------------------------------------
0.00 0.00 9146/9146 trier_entrees [25]
[17] 0.0 0.00 0.00 9146 retablir_tas [17]
0.00 0.00 135315/135315 doit_echanger [15]
-----------------------------------------------
0.00 0.00 6706/6706 doit_echanger [15]
[18] 0.0 0.00 0.00 6706 comparer [18]
-----------------------------------------------
0.00 0.00 6098/6098 compter_mot [6]
[19] 0.0 0.00 0.00 6098 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 6099/27033 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 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 9146/9146 retablir_tas [17]
-----------------------------------------------
Index by function name
[16] ajouter [4] decouper_lignes [13] initialiser_mots_vides
[12] alea [15] doit_echanger [23] longueur_moyenne
[3] analyser_bigrammes [21] ecart_type_longueur [1] main
[9] chercher_mot [8] egales [10] normaliser_ligne
[18] comparer [22] empreinte [24] racine
[6] compter_mot [7] est_mot_vide [17] retablir_tas
[2] compter_mots_ligne [5] generer_texte [25] trier_entrees
[20] construire_rapport [14] generer_vocabulaire
[19] copier [11] hacher_mot
File diff suppressed because it is too large Load Diff
+89 -43
View File
@@ -14,15 +14,17 @@
* 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>
#include <stdlib.h>
#define NB_MOTS_TEXTE 250000
#define NB_MOTS_TEXTE 10000000
#define NB_MOTS_VOCAB 7000
#define TAILLE_MOT 32
#define MAX_MOTS_UNIQUES 20000
@@ -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",
@@ -181,7 +172,10 @@ char *generer_texte(char **vocab, int nb_mots)
/* Découpage et normalisation */
/* ------------------------------------------------------------------------ */
char **decouper_lignes(const char *texte, int *nb_lignes)
/* Remplace les '\n' par '\0' et renvoie des pointeurs dans texte.
* Les lignes restent valides tant que texte existe : ne pas les libérer
* individuellement. Seules les lignes terminées par '\n' sont retournées. */
char **decouper_lignes(char *texte, int *nb_lignes)
{
int capacite = 1024;
char **lignes = malloc(capacite * sizeof(char *));
@@ -190,15 +184,12 @@ char **decouper_lignes(const char *texte, int *nb_lignes)
for (int i = 0; texte[i] != '\0'; i++) {
if (texte[i] == '\n') {
int taille = i - debut;
if (n == capacite) {
capacite *= 2;
lignes = realloc(lignes, capacite * sizeof(char *));
}
lignes[n] = malloc(taille + 1);
for (int j = 0; j < taille; j++)
lignes[n][j] = texte[debut + j];
lignes[n][taille] = '\0';
lignes[n] = texte + debut;
texte[i] = '\0';
n++;
debut = i + 1;
}
@@ -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;
}
}
@@ -502,8 +549,7 @@ int main(void)
free(rapport);
free(table);
for (int i = 0; i < nb_lignes; i++)
free(lignes[i]);
/* Les caractères des lignes appartiennent au tampon texte. */
free(lignes);
free(texte);
for (int i = 0; i < NB_MOTS_VOCAB; i++)