11 Commits

Author SHA1 Message Date
rabot 2878461ebd Compte rendu final 2026-10-07 12:50:25 +02:00
rabot c9b14f4c2e Update rapport 2026-10-07 12:42:56 +02:00
rabot ed2e1cd102 Compte rendu 2026-10-07 12:37:15 +02:00
rabot e99abeb267 Woops 2026-10-07 12:21:17 +02:00
rabot 57c9ce933b Remplacement du tri à bulles par un tri par tas pour améliorer les performances de tri 2026-10-07 12:20:50 +02:00
rabot 1c4405c75e Optimisation des performances en mémorisant la longueur des mots et en supprimant les parcours redondants 2026-10-07 12:12:56 +02:00
rabot 57aaec48d0 Remplacement de la recherche dichotomique par une table de hachage 2026-10-07 11:51:31 +02:00
rabot d3f19871d7 Optimisation de l'écart-type de longueur en réutilisant la moyenne calculée 2026-10-07 11:39:55 +02:00
rabot be387e2066 Optimisé chercher_mot par recherche dichotomique 2026-10-07 11:30:14 +02:00
rabot 55320bdfea Update README.md 2026-10-07 10:40:06 +02:00
rabot e6b452bdbe Fix erreur du prof 2026-10-07 10:33:37 +02:00
14 changed files with 7523 additions and 40 deletions
+68
View File
@@ -0,0 +1,68 @@
# Compte rendu — Optimisation de l'analyseur de mots
**R5.A.04 — Qualité algorithmique**
**Adrien RABOT — Théo ANASTASIO**
## 1. Objectif et méthode
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 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.
## 2. Analyse et pistes prioritaires
Le profil initial conduit aux priorités suivantes, classées par gain attendu :
1. **Accélérer la recherche des mots.** La recherche linéaire provoque
296 656 203 appels à `egales`. Une recherche dichotomique ou une table
de hachage permet de réduire ces comparaisons.
2. **Calculer la moyenne une seule fois.** `longueur_moyenne` est appelée
5 867 fois, car la variance recalcule la même moyenne pour chaque mot.
3. **Supprimer les parcours répétés des chaînes.** `longueur` est appelée
36 009 819 fois au total. Mémoriser les longueurs et les positions de fin
évite de reparcourir les mots, les lignes et le rapport.
4. **Remplacer le tri à bulles.** Ses 17 202 045 appels à `doit_echanger`
justifient un tri en O(n log n).
## 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.
| Optimisation | Modification | Avant | Après | Temps gagné |
| --- | --- | ---: | ---: | ---: |
| Recherche dichotomique | Tableau maintenu trié, recherche en O(log n) | 2,80 s | 1,45 s | ≈ 48 % |
| Moyenne | Un seul calcul, transmis au calcul de variance | 1,46 s | 0,88 s | ≈ 40 % |
| 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 % |
La version finale 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.
## 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 :
| Mesure | Version initiale | Version finale |
| --- | ---: | ---: |
| 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.
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).
+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.
+96 -40
View File
@@ -14,7 +14,7 @@
* 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 -g -pg analyseur.c -o analyseur
* Compilation : gcc -O0 -pg analyseur.c -o analyseur
* Exécution : ./analyseur
* Profil : gprof ./analyseur gmon.out > profil.txt
*/
@@ -26,6 +26,8 @@
#define NB_MOTS_VOCAB 7000
#define TAILLE_MOT 32
#define MAX_MOTS_UNIQUES 20000
/* Toujours moins de 50 % de cases occupées, même au maximum de mots. */
#define TAILLE_HACHAGE (2 * MAX_MOTS_UNIQUES + 1)
#define GRAINE 20261006UL
/* ------------------------------------------------------------------------ */
@@ -44,14 +46,6 @@ unsigned long alea(void)
/* Fonctions utilitaires sur les chaînes */
/* ------------------------------------------------------------------------ */
int longueur(const char *s)
{
int n = 0;
while (s[n] != '\0')
n++;
return n;
}
void copier(char *dest, const char *src)
{
int i = 0;
@@ -81,9 +75,14 @@ int comparer(const char *a, const char *b)
return (unsigned char)a[i] - (unsigned char)b[i];
}
void ajouter(char *dest, const char *src)
/* position indique la fin de dest et avance avec les caractères ajoutés. */
void ajouter(char *dest, const char *src, size_t *position)
{
copier(dest + longueur(dest), src);
size_t fin = *position;
for (size_t i = 0; src[i] != '\0'; i++)
dest[fin++] = src[i];
dest[fin] = '\0';
*position = fin;
}
char en_minuscule(char c)
@@ -126,9 +125,10 @@ char **generer_vocabulaire(void)
for (int i = 0; i < NB_MOTS_VOCAB; i++) {
vocab[i] = malloc(TAILLE_MOT);
vocab[i][0] = '\0';
size_t position = 0;
int nb_syllabes = 2 + alea() % 3;
for (int j = 0; j < nb_syllabes; j++)
ajouter(vocab[i], SYLLABES[alea() % NB_SYLLABES]);
ajouter(vocab[i], SYLLABES[alea() % NB_SYLLABES], &position);
}
return vocab;
}
@@ -209,7 +209,7 @@ char **decouper_lignes(const char *texte, int *nb_lignes)
void normaliser_ligne(char *ligne)
{
for (int i = 0; i < longueur(ligne); i++) {
for (int i = 0; ligne[i] != '\0'; i++) {
if (est_lettre(ligne[i]))
ligne[i] = en_minuscule(ligne[i]);
else
@@ -224,6 +224,7 @@ void normaliser_ligne(char *ligne)
typedef struct {
char mot[TAILLE_MOT];
int occurrences;
int taille;
} Entree;
int est_mot_vide(const char *mot)
@@ -235,29 +236,56 @@ int est_mot_vide(const char *mot)
return 0;
}
int chercher_mot(Entree *table, int nb_entrees, const char *mot)
unsigned int hacher_mot(const char *mot)
{
for (int i = 0; i < nb_entrees; i++) {
if (egales(table[i].mot, mot))
return i;
unsigned int h = 2166136261u;
for (int i = 0; mot[i] != '\0'; i++) {
h ^= (unsigned char)mot[i];
h *= 16777619u;
}
return -1;
return h;
}
void compter_mot(Entree *table, int *nb_entrees, const char *mot)
/* 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)
{
int indice = chercher_mot(table, *nb_entrees, mot);
int position = hacher_mot(mot) % TAILLE_HACHAGE;
while (index_mots[position] != 0) {
int indice = index_mots[position] - 1;
if (egales(table[indice].mot, mot))
return indice;
/* Collision : essayer la case suivante, avec retour au début. */
position = (position + 1) % TAILLE_HACHAGE;
}
return -(position + 1);
}
void compter_mot(Entree *table, int *nb_entrees, int *index_mots,
const char *mot, int taille)
{
int indice = chercher_mot(table, index_mots, mot);
if (indice >= 0) {
table[indice].occurrences++;
} else {
copier(table[*nb_entrees].mot, mot);
table[*nb_entrees].occurrences = 1;
if (*nb_entrees >= MAX_MOTS_UNIQUES) {
fprintf(stderr, "Trop de mots distincts (maximum : %d).\n",
MAX_MOTS_UNIQUES);
exit(EXIT_FAILURE);
}
int position = -indice - 1;
indice = *nb_entrees;
copier(table[indice].mot, mot);
table[indice].occurrences = 1;
table[indice].taille = taille;
index_mots[position] = indice + 1;
(*nb_entrees)++;
}
}
void compter_mots_ligne(Entree *table, int *nb_entrees, const char *ligne,
long *nb_mots_total)
void compter_mots_ligne(Entree *table, int *nb_entrees, int *index_mots,
const char *ligne, long *nb_mots_total)
{
char mot[TAILLE_MOT];
int i = 0;
@@ -275,7 +303,7 @@ void compter_mots_ligne(Entree *table, int *nb_entrees, const char *ligne,
if (k > 0) {
(*nb_mots_total)++;
if (!est_mot_vide(mot))
compter_mot(table, nb_entrees, mot);
compter_mot(table, nb_entrees, index_mots, mot, k);
}
}
}
@@ -291,16 +319,33 @@ int doit_echanger(const Entree *a, const Entree *b)
return comparer(a->mot, b->mot) > 0;
}
/* La racine du tas est l'entrée qui doit apparaître le plus tard. */
void retablir_tas(Entree *table, int n, int racine)
{
while (racine < n / 2) {
int enfant = 2 * racine + 1;
if (enfant + 1 < n && doit_echanger(&table[enfant + 1], &table[enfant]))
enfant++;
if (!doit_echanger(&table[enfant], &table[racine]))
break;
Entree tmp = table[racine];
table[racine] = table[enfant];
table[enfant] = tmp;
racine = enfant;
}
}
void trier_entrees(Entree *table, int n)
{
for (int i = 0; i < n - 1; i++) {
for (int j = 0; j < n - 1 - i; j++) {
if (doit_echanger(&table[j], &table[j + 1])) {
Entree tmp = table[j];
table[j] = table[j + 1];
table[j + 1] = tmp;
}
}
/* Construire le tas, puis placer chaque racine à sa position finale. */
for (int i = n / 2 - 1; i >= 0; i--)
retablir_tas(table, n, i);
for (int fin = n - 1; fin > 0; fin--) {
Entree tmp = table[0];
table[0] = table[fin];
table[fin] = tmp;
retablir_tas(table, fin, 0);
}
}
@@ -312,15 +357,16 @@ double longueur_moyenne(const Entree *table, int n)
{
long total = 0;
for (int i = 0; i < n; i++)
total += longueur(table[i].mot);
total += table[i].taille;
return (double)total / n;
}
double ecart_type_longueur(const Entree *table, int n)
/* Réutiliser la moyenne calculée dans main évite de la recalculer par mot. */
double ecart_type_longueur(const Entree *table, int n, double moyenne)
{
double somme = 0.0;
for (int i = 0; i < n; i++) {
double ecart = longueur(table[i].mot) - longueur_moyenne(table, n);
double ecart = table[i].taille - moyenne;
somme += ecart * ecart;
}
return somme / n; /* variance ; la racine est prise dans main */
@@ -371,12 +417,13 @@ char *construire_rapport(const Entree *table, int n)
char *rapport = malloc((size_t)n * 64 + 256);
char ligne[128];
rapport[0] = '\0';
size_t position = 0;
ajouter(rapport, "rang;mot;occurrences\n");
ajouter(rapport, "rang;mot;occurrences\n", &position);
for (int i = 0; i < n; i++) {
snprintf(ligne, sizeof(ligne), "%d;%s;%d\n",
i + 1, table[i].mot, table[i].occurrences);
ajouter(rapport, ligne);
ajouter(rapport, ligne, &position);
}
return rapport;
}
@@ -412,15 +459,24 @@ int main(void)
normaliser_ligne(lignes[i]);
Entree *table = malloc(MAX_MOTS_UNIQUES * sizeof(Entree));
int *index_mots = calloc(TAILLE_HACHAGE, sizeof(int));
if (table == NULL || index_mots == NULL) {
fprintf(stderr, "Allocation du tableau de comptage impossible.\n");
free(table);
free(index_mots);
exit(EXIT_FAILURE);
}
int nb_entrees = 0;
long nb_mots_total = 0;
for (int i = 0; i < nb_lignes; i++)
compter_mots_ligne(table, &nb_entrees, lignes[i], &nb_mots_total);
compter_mots_ligne(table, &nb_entrees, index_mots, lignes[i], &nb_mots_total);
/* Le tri déplace les entrées : l'index ne sert que pendant le comptage. */
free(index_mots);
trier_entrees(table, nb_entrees);
double moyenne = longueur_moyenne(table, nb_entrees);
double ecart_type = racine(ecart_type_longueur(table, nb_entrees));
double ecart_type = racine(ecart_type_longueur(table, nb_entrees, moyenne));
char trigramme[4];
int occ_trigramme;
+445
View File
@@ -0,0 +1,445 @@
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
```
Executable
BIN
View File
Binary file not shown.
BIN
View File
Binary file not shown.
+11
View File
@@ -0,0 +1,11 @@
version;execution;temps_reel_s;temps_user_s;temps_systeme_s;pic_rss_kio
initial;1;2.83;2.82;0.00;6664
final;1;0.11;0.11;0.00;6672
final;2;0.11;0.11;0.00;6664
initial;2;2.80;2.80;0.00;6672
initial;3;2.81;2.80;0.00;6564
final;3;0.11;0.11;0.00;6672
final;4;0.11;0.10;0.00;6668
initial;4;2.79;2.79;0.00;6672
initial;5;2.82;2.81;0.00;6504
final;5;0.11;0.11;0.00;6652
1 version execution temps_reel_s temps_user_s temps_systeme_s pic_rss_kio
2 initial 1 2.83 2.82 0.00 6664
3 final 1 0.11 0.11 0.00 6672
4 final 2 0.11 0.11 0.00 6664
5 initial 2 2.80 2.80 0.00 6672
6 initial 3 2.81 2.80 0.00 6564
7 final 3 0.11 0.11 0.00 6672
8 final 4 0.11 0.10 0.00 6668
9 initial 4 2.79 2.79 0.00 6672
10 initial 5 2.82 2.81 0.00 6504
11 final 5 0.11 0.11 0.00 6652
+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
64.58 0.78 0.78 36009819 0.00 0.00 longueur
9.17 0.89 0.11 5867 0.02 0.14 longueur_moyenne
7.50 0.97 0.09 1 90.00 139.54 trier_entrees
5.00 1.03 0.06 9860216 0.00 0.00 comparer
2.92 1.07 0.04 32667 0.00 0.00 copier
2.50 1.10 0.03 12045671 0.00 0.00 egales
2.50 1.13 0.03 _init
1.67 1.15 0.02 250000 0.00 0.00 est_mot_vide
1.67 1.17 0.02 150182 0.00 0.00 chercher_mot
1.67 1.19 0.02 150182 0.00 0.00 compter_mot
0.83 1.20 0.01 1 10.00 10.00 decouper_lignes
0.00 1.20 0.00 17202045 0.00 0.00 doit_echanger
0.00 1.20 0.00 5297256 0.00 0.00 est_lettre
0.00 1.20 0.00 1266663 0.00 0.00 en_minuscule
0.00 1.20 0.00 928117 0.00 0.00 alea
0.00 1.20 0.00 26801 0.00 0.00 ajouter
0.00 1.20 0.00 21746 0.00 0.00 compter_mots_ligne
0.00 1.20 0.00 21746 0.00 0.00 normaliser_ligne
0.00 1.20 0.00 1 0.00 0.00 analyser_bigrammes
0.00 1.20 0.00 1 0.00 6.41 construire_rapport
0.00 1.20 0.00 1 0.00 850.68 ecart_type_longueur
0.00 1.20 0.00 1 0.00 0.00 empreinte
0.00 1.20 0.00 1 0.00 0.00 generer_texte
0.00 1.20 0.00 1 0.00 22.88 generer_vocabulaire
0.00 1.20 0.00 1 0.00 0.00 racine
Call graph
granularity: each sample hit covers 4 byte(s) for 0.83% of 1.20 seconds
index % time self children called name
<spontaneous>
[1] 97.5 0.00 1.17 main [1]
0.00 0.85 1/1 ecart_type_longueur [3]
0.09 0.05 1/1 trier_entrees [5]
0.00 0.11 21746/21746 compter_mots_ligne [6]
0.00 0.03 21746/21746 normaliser_ligne [12]
0.00 0.02 1/1 generer_vocabulaire [17]
0.01 0.00 1/1 decouper_lignes [18]
0.00 0.01 1/1 construire_rapport [19]
0.00 0.00 1/5867 longueur_moyenne [2]
0.00 0.00 1/1 generer_texte [25]
0.00 0.00 1/1 racine [26]
0.00 0.00 1/1 analyser_bigrammes [23]
0.00 0.00 1/1 empreinte [24]
-----------------------------------------------
0.00 0.00 1/5867 main [1]
0.11 0.74 5866/5867 ecart_type_longueur [3]
[2] 70.9 0.11 0.74 5867 longueur_moyenne [2]
0.74 0.00 34415822/36009819 longueur [4]
-----------------------------------------------
0.00 0.85 1/1 main [1]
[3] 70.9 0.00 0.85 1 ecart_type_longueur [3]
0.11 0.74 5866/5867 longueur_moyenne [2]
0.00 0.00 5866/36009819 longueur [4]
-----------------------------------------------
0.00 0.00 5866/36009819 ecart_type_longueur [3]
0.00 0.00 26801/36009819 ajouter [16]
0.03 0.00 1561330/36009819 normaliser_ligne [12]
0.74 0.00 34415822/36009819 longueur_moyenne [2]
[4] 64.6 0.78 0.00 36009819 longueur [4]
-----------------------------------------------
0.09 0.05 1/1 main [1]
[5] 11.6 0.09 0.05 1 trier_entrees [5]
0.00 0.05 17202045/17202045 doit_echanger [10]
-----------------------------------------------
0.00 0.11 21746/21746 main [1]
[6] 8.9 0.00 0.11 21746 compter_mots_ligne [6]
0.02 0.04 150182/150182 compter_mot [8]
0.02 0.03 250000/250000 est_mot_vide [9]
-----------------------------------------------
0.01 0.00 1718447/9860216 chercher_mot [13]
0.05 0.00 8141769/9860216 doit_echanger [10]
[7] 5.0 0.06 0.00 9860216 comparer [7]
-----------------------------------------------
0.02 0.04 150182/150182 compter_mots_ligne [6]
[8] 4.7 0.02 0.04 150182 compter_mot [8]
0.02 0.01 150182/150182 chercher_mot [13]
0.01 0.00 5866/32667 copier [11]
-----------------------------------------------
0.02 0.03 250000/250000 compter_mots_ligne [6]
[9] 4.2 0.02 0.03 250000 est_mot_vide [9]
0.03 0.00 12045671/12045671 egales [14]
-----------------------------------------------
0.00 0.05 17202045/17202045 trier_entrees [5]
[10] 4.1 0.00 0.05 17202045 doit_echanger [10]
0.05 0.00 8141769/9860216 comparer [7]
-----------------------------------------------
0.01 0.00 5866/32667 compter_mot [8]
0.03 0.00 26801/32667 ajouter [16]
[11] 2.9 0.04 0.00 32667 copier [11]
-----------------------------------------------
0.00 0.03 21746/21746 main [1]
[12] 2.8 0.00 0.03 21746 normaliser_ligne [12]
0.03 0.00 1561330/36009819 longueur [4]
0.00 0.00 1539584/5297256 est_lettre [20]
0.00 0.00 1266663/1266663 en_minuscule [21]
-----------------------------------------------
0.02 0.01 150182/150182 compter_mot [8]
[13] 2.5 0.02 0.01 150182 chercher_mot [13]
0.01 0.00 1718447/9860216 comparer [7]
-----------------------------------------------
0.03 0.00 12045671/12045671 est_mot_vide [9]
[14] 2.5 0.03 0.00 12045671 egales [14]
-----------------------------------------------
<spontaneous>
[15] 2.5 0.03 0.00 _init [15]
-----------------------------------------------
0.00 0.01 5867/26801 construire_rapport [19]
0.00 0.02 20934/26801 generer_vocabulaire [17]
[16] 2.4 0.00 0.03 26801 ajouter [16]
0.03 0.00 26801/32667 copier [11]
0.00 0.00 26801/36009819 longueur [4]
-----------------------------------------------
0.00 0.02 1/1 main [1]
[17] 1.9 0.00 0.02 1 generer_vocabulaire [17]
0.00 0.02 20934/26801 ajouter [16]
0.00 0.00 27934/928117 alea [22]
-----------------------------------------------
0.01 0.00 1/1 main [1]
[18] 0.8 0.01 0.00 1 decouper_lignes [18]
-----------------------------------------------
0.00 0.01 1/1 main [1]
[19] 0.5 0.00 0.01 1 construire_rapport [19]
0.00 0.01 5867/26801 ajouter [16]
-----------------------------------------------
0.00 0.00 1539584/5297256 normaliser_ligne [12]
0.00 0.00 3757672/5297256 analyser_bigrammes [23]
[20] 0.0 0.00 0.00 5297256 est_lettre [20]
-----------------------------------------------
0.00 0.00 1266663/1266663 normaliser_ligne [12]
[21] 0.0 0.00 0.00 1266663 en_minuscule [21]
-----------------------------------------------
0.00 0.00 27934/928117 generer_vocabulaire [17]
0.00 0.00 900183/928117 generer_texte [25]
[22] 0.0 0.00 0.00 928117 alea [22]
-----------------------------------------------
0.00 0.00 1/1 main [1]
[23] 0.0 0.00 0.00 1 analyser_bigrammes [23]
0.00 0.00 3757672/5297256 est_lettre [20]
-----------------------------------------------
0.00 0.00 1/1 main [1]
[24] 0.0 0.00 0.00 1 empreinte [24]
-----------------------------------------------
0.00 0.00 1/1 main [1]
[25] 0.0 0.00 0.00 1 generer_texte [25]
0.00 0.00 900183/928117 alea [22]
-----------------------------------------------
0.00 0.00 1/1 main [1]
[26] 0.0 0.00 0.00 1 racine [26]
-----------------------------------------------
Index by function name
[15] _init [11] copier [25] generer_texte
[16] ajouter [18] decouper_lignes [17] generer_vocabulaire
[22] alea [10] doit_echanger [4] longueur
[23] analyser_bigrammes [3] ecart_type_longueur [2] longueur_moyenne
[13] chercher_mot [14] egales [12] normaliser_ligne
[7] comparer [24] empreinte [26] racine
[8] compter_mot [21] en_minuscule [5] trier_entrees
[6] compter_mots_ligne [20] est_lettre
[19] construire_rapport [9] est_mot_vide
+172
View File
@@ -0,0 +1,172 @@
Flat profile:
Each sample counts as 0.01 seconds.
% cumulative self self total
time seconds seconds calls ms/call ms/call name
61.64 0.45 0.45 1599863 0.00 0.00 longueur
10.27 0.53 0.07 12172087 0.00 0.00 comparer
9.59 0.59 0.07 1 70.00 195.00 trier_entrees
6.85 0.65 0.05 17202045 0.00 0.00 doit_echanger
5.48 0.69 0.04 250000 0.00 0.00 est_mot_vide
2.05 0.70 0.01 12198772 0.00 0.00 egales
1.37 0.71 0.01 150182 0.00 0.00 chercher_mot
1.37 0.72 0.01 1 10.00 10.00 decouper_lignes
1.37 0.73 0.01 _init
0.00 0.73 0.00 5297256 0.00 0.00 est_lettre
0.00 0.73 0.00 1266663 0.00 0.00 en_minuscule
0.00 0.73 0.00 928117 0.00 0.00 alea
0.00 0.73 0.00 150182 0.00 0.00 compter_mot
0.00 0.73 0.00 150182 0.00 0.00 hacher_mot
0.00 0.73 0.00 32667 0.00 0.00 copier
0.00 0.73 0.00 26801 0.00 0.00 ajouter
0.00 0.73 0.00 21746 0.00 0.00 compter_mots_ligne
0.00 0.73 0.00 21746 0.00 0.02 normaliser_ligne
0.00 0.73 0.00 1 0.00 0.00 analyser_bigrammes
0.00 0.73 0.00 1 0.00 1.65 construire_rapport
0.00 0.73 0.00 1 0.00 1.65 ecart_type_longueur
0.00 0.73 0.00 1 0.00 0.00 empreinte
0.00 0.73 0.00 1 0.00 0.00 generer_texte
0.00 0.73 0.00 1 0.00 5.89 generer_vocabulaire
0.00 0.73 0.00 1 0.00 1.65 longueur_moyenne
0.00 0.73 0.00 1 0.00 0.00 racine
Call graph
granularity: each sample hit covers 4 byte(s) for 1.37% of 0.73 seconds
index % time self children called name
<spontaneous>
[1] 98.6 0.00 0.72 main [1]
0.00 0.44 21746/21746 normaliser_ligne [3]
0.07 0.12 1/1 trier_entrees [4]
0.00 0.07 21746/21746 compter_mots_ligne [7]
0.01 0.00 1/1 decouper_lignes [12]
0.00 0.01 1/1 generer_vocabulaire [15]
0.00 0.00 1/1 construire_rapport [16]
0.00 0.00 1/1 longueur_moyenne [18]
0.00 0.00 1/1 ecart_type_longueur [17]
0.00 0.00 1/1 generer_texte [26]
0.00 0.00 1/1 racine [27]
0.00 0.00 1/1 analyser_bigrammes [24]
0.00 0.00 1/1 empreinte [25]
-----------------------------------------------
0.00 0.00 5866/1599863 longueur_moyenne [18]
0.00 0.00 5866/1599863 ecart_type_longueur [17]
0.01 0.00 26801/1599863 ajouter [14]
0.44 0.00 1561330/1599863 normaliser_ligne [3]
[2] 61.6 0.45 0.00 1599863 longueur [2]
-----------------------------------------------
0.00 0.44 21746/21746 main [1]
[3] 60.2 0.00 0.44 21746 normaliser_ligne [3]
0.44 0.00 1561330/1599863 longueur [2]
0.00 0.00 1539584/5297256 est_lettre [19]
0.00 0.00 1266663/1266663 en_minuscule [20]
-----------------------------------------------
0.07 0.12 1/1 main [1]
[4] 26.7 0.07 0.12 1 trier_entrees [4]
0.05 0.07 17202045/17202045 doit_echanger [5]
-----------------------------------------------
0.05 0.07 17202045/17202045 trier_entrees [4]
[5] 17.1 0.05 0.07 17202045 doit_echanger [5]
0.07 0.00 12172087/12172087 comparer [6]
-----------------------------------------------
0.07 0.00 12172087/12172087 doit_echanger [5]
[6] 10.3 0.07 0.00 12172087 comparer [6]
-----------------------------------------------
0.00 0.07 21746/21746 main [1]
[7] 8.9 0.00 0.07 21746 compter_mots_ligne [7]
0.04 0.01 250000/250000 est_mot_vide [8]
0.00 0.01 150182/150182 compter_mot [11]
-----------------------------------------------
0.04 0.01 250000/250000 compter_mots_ligne [7]
[8] 7.5 0.04 0.01 250000 est_mot_vide [8]
0.01 0.00 12045671/12198772 egales [9]
-----------------------------------------------
0.00 0.00 153101/12198772 chercher_mot [10]
0.01 0.00 12045671/12198772 est_mot_vide [8]
[9] 2.1 0.01 0.00 12198772 egales [9]
-----------------------------------------------
0.01 0.00 150182/150182 compter_mot [11]
[10] 1.4 0.01 0.00 150182 chercher_mot [10]
0.00 0.00 153101/12198772 egales [9]
0.00 0.00 150182/150182 hacher_mot [22]
-----------------------------------------------
0.00 0.01 150182/150182 compter_mots_ligne [7]
[11] 1.4 0.00 0.01 150182 compter_mot [11]
0.01 0.00 150182/150182 chercher_mot [10]
0.00 0.00 5866/32667 copier [23]
-----------------------------------------------
0.01 0.00 1/1 main [1]
[12] 1.4 0.01 0.00 1 decouper_lignes [12]
-----------------------------------------------
<spontaneous>
[13] 1.4 0.01 0.00 _init [13]
-----------------------------------------------
0.00 0.00 5867/26801 construire_rapport [16]
0.00 0.01 20934/26801 generer_vocabulaire [15]
[14] 1.0 0.00 0.01 26801 ajouter [14]
0.01 0.00 26801/1599863 longueur [2]
0.00 0.00 26801/32667 copier [23]
-----------------------------------------------
0.00 0.01 1/1 main [1]
[15] 0.8 0.00 0.01 1 generer_vocabulaire [15]
0.00 0.01 20934/26801 ajouter [14]
0.00 0.00 27934/928117 alea [21]
-----------------------------------------------
0.00 0.00 1/1 main [1]
[16] 0.2 0.00 0.00 1 construire_rapport [16]
0.00 0.00 5867/26801 ajouter [14]
-----------------------------------------------
0.00 0.00 1/1 main [1]
[17] 0.2 0.00 0.00 1 ecart_type_longueur [17]
0.00 0.00 5866/1599863 longueur [2]
-----------------------------------------------
0.00 0.00 1/1 main [1]
[18] 0.2 0.00 0.00 1 longueur_moyenne [18]
0.00 0.00 5866/1599863 longueur [2]
-----------------------------------------------
0.00 0.00 1539584/5297256 normaliser_ligne [3]
0.00 0.00 3757672/5297256 analyser_bigrammes [24]
[19] 0.0 0.00 0.00 5297256 est_lettre [19]
-----------------------------------------------
0.00 0.00 1266663/1266663 normaliser_ligne [3]
[20] 0.0 0.00 0.00 1266663 en_minuscule [20]
-----------------------------------------------
0.00 0.00 27934/928117 generer_vocabulaire [15]
0.00 0.00 900183/928117 generer_texte [26]
[21] 0.0 0.00 0.00 928117 alea [21]
-----------------------------------------------
0.00 0.00 150182/150182 chercher_mot [10]
[22] 0.0 0.00 0.00 150182 hacher_mot [22]
-----------------------------------------------
0.00 0.00 5866/32667 compter_mot [11]
0.00 0.00 26801/32667 ajouter [14]
[23] 0.0 0.00 0.00 32667 copier [23]
-----------------------------------------------
0.00 0.00 1/1 main [1]
[24] 0.0 0.00 0.00 1 analyser_bigrammes [24]
0.00 0.00 3757672/5297256 est_lettre [19]
-----------------------------------------------
0.00 0.00 1/1 main [1]
[25] 0.0 0.00 0.00 1 empreinte [25]
-----------------------------------------------
0.00 0.00 1/1 main [1]
[26] 0.0 0.00 0.00 1 generer_texte [26]
0.00 0.00 900183/928117 alea [21]
-----------------------------------------------
0.00 0.00 1/1 main [1]
[27] 0.0 0.00 0.00 1 racine [27]
-----------------------------------------------
Index by function name
[13] _init [23] copier [26] generer_texte
[14] ajouter [12] decouper_lignes [15] generer_vocabulaire
[21] alea [5] doit_echanger [22] hacher_mot
[24] analyser_bigrammes [17] ecart_type_longueur [2] longueur
[10] chercher_mot [9] egales [18] longueur_moyenne
[6] comparer [25] empreinte [3] normaliser_ligne
[11] compter_mot [20] en_minuscule [27] racine
[7] compter_mots_ligne [19] est_lettre [4] trier_entrees
[16] construire_rapport [8] est_mot_vide
+159
View File
@@ -0,0 +1,159 @@
Flat profile:
Each sample counts as 0.01 seconds.
% cumulative self self total
time seconds seconds calls ms/call ms/call name
22.22 0.06 0.06 250000 0.00 0.00 est_mot_vide
18.52 0.11 0.05 17202045 0.00 0.00 doit_echanger
12.96 0.14 0.04 12172087 0.00 0.00 comparer
11.11 0.17 0.03 5297256 0.00 0.00 est_lettre
11.11 0.20 0.03 _init
9.26 0.23 0.03 12198772 0.00 0.00 egales
7.41 0.25 0.02 1 20.00 105.00 trier_entrees
3.70 0.26 0.01 21746 0.00 0.00 normaliser_ligne
1.85 0.27 0.01 150182 0.00 0.00 chercher_mot
1.85 0.27 0.01 150182 0.00 0.00 hacher_mot
0.00 0.27 0.00 1266663 0.00 0.00 en_minuscule
0.00 0.27 0.00 928117 0.00 0.00 alea
0.00 0.27 0.00 150182 0.00 0.00 compter_mot
0.00 0.27 0.00 26801 0.00 0.00 ajouter
0.00 0.27 0.00 21746 0.00 0.00 compter_mots_ligne
0.00 0.27 0.00 5866 0.00 0.00 copier
0.00 0.27 0.00 1 0.00 21.28 analyser_bigrammes
0.00 0.27 0.00 1 0.00 0.00 construire_rapport
0.00 0.27 0.00 1 0.00 0.00 decouper_lignes
0.00 0.27 0.00 1 0.00 0.00 ecart_type_longueur
0.00 0.27 0.00 1 0.00 0.00 empreinte
0.00 0.27 0.00 1 0.00 0.00 generer_texte
0.00 0.27 0.00 1 0.00 0.00 generer_vocabulaire
0.00 0.27 0.00 1 0.00 0.00 longueur_moyenne
0.00 0.27 0.00 1 0.00 0.00 racine
Call graph
granularity: each sample hit covers 4 byte(s) for 3.70% of 0.27 seconds
index % time self children called name
<spontaneous>
[1] 88.9 0.00 0.24 main [1]
0.02 0.09 1/1 trier_entrees [2]
0.00 0.10 21746/21746 compter_mots_ligne [3]
0.00 0.02 1/1 analyser_bigrammes [10]
0.01 0.01 21746/21746 normaliser_ligne [11]
0.00 0.00 1/1 generer_vocabulaire [24]
0.00 0.00 1/1 generer_texte [23]
0.00 0.00 1/1 decouper_lignes [20]
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 [19]
0.00 0.00 1/1 empreinte [22]
-----------------------------------------------
0.02 0.09 1/1 main [1]
[2] 38.9 0.02 0.09 1 trier_entrees [2]
0.05 0.04 17202045/17202045 doit_echanger [4]
-----------------------------------------------
0.00 0.10 21746/21746 main [1]
[3] 35.2 0.00 0.10 21746 compter_mots_ligne [3]
0.06 0.02 250000/250000 est_mot_vide [5]
0.00 0.01 150182/150182 compter_mot [13]
-----------------------------------------------
0.05 0.04 17202045/17202045 trier_entrees [2]
[4] 31.5 0.05 0.04 17202045 doit_echanger [4]
0.04 0.00 12172087/12172087 comparer [6]
-----------------------------------------------
0.06 0.02 250000/250000 compter_mots_ligne [3]
[5] 31.4 0.06 0.02 250000 est_mot_vide [5]
0.02 0.00 12045671/12198772 egales [9]
-----------------------------------------------
0.04 0.00 12172087/12172087 doit_echanger [4]
[6] 13.0 0.04 0.00 12172087 comparer [6]
-----------------------------------------------
0.01 0.00 1539584/5297256 normaliser_ligne [11]
0.02 0.00 3757672/5297256 analyser_bigrammes [10]
[7] 11.1 0.03 0.00 5297256 est_lettre [7]
-----------------------------------------------
<spontaneous>
[8] 11.1 0.03 0.00 _init [8]
-----------------------------------------------
0.00 0.00 153101/12198772 chercher_mot [12]
0.02 0.00 12045671/12198772 est_mot_vide [5]
[9] 9.3 0.03 0.00 12198772 egales [9]
-----------------------------------------------
0.00 0.02 1/1 main [1]
[10] 7.9 0.00 0.02 1 analyser_bigrammes [10]
0.02 0.00 3757672/5297256 est_lettre [7]
-----------------------------------------------
0.01 0.01 21746/21746 main [1]
[11] 6.9 0.01 0.01 21746 normaliser_ligne [11]
0.01 0.00 1539584/5297256 est_lettre [7]
0.00 0.00 1266663/1266663 en_minuscule [15]
-----------------------------------------------
0.01 0.01 150182/150182 compter_mot [13]
[12] 3.8 0.01 0.01 150182 chercher_mot [12]
0.01 0.00 150182/150182 hacher_mot [14]
0.00 0.00 153101/12198772 egales [9]
-----------------------------------------------
0.00 0.01 150182/150182 compter_mots_ligne [3]
[13] 3.8 0.00 0.01 150182 compter_mot [13]
0.01 0.01 150182/150182 chercher_mot [12]
0.00 0.00 5866/5866 copier [18]
-----------------------------------------------
0.01 0.00 150182/150182 chercher_mot [12]
[14] 1.9 0.01 0.00 150182 hacher_mot [14]
-----------------------------------------------
0.00 0.00 1266663/1266663 normaliser_ligne [11]
[15] 0.0 0.00 0.00 1266663 en_minuscule [15]
-----------------------------------------------
0.00 0.00 27934/928117 generer_vocabulaire [24]
0.00 0.00 900183/928117 generer_texte [23]
[16] 0.0 0.00 0.00 928117 alea [16]
-----------------------------------------------
0.00 0.00 5867/26801 construire_rapport [19]
0.00 0.00 20934/26801 generer_vocabulaire [24]
[17] 0.0 0.00 0.00 26801 ajouter [17]
-----------------------------------------------
0.00 0.00 5866/5866 compter_mot [13]
[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 [17]
-----------------------------------------------
0.00 0.00 1/1 main [1]
[20] 0.0 0.00 0.00 1 decouper_lignes [20]
-----------------------------------------------
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 [16]
-----------------------------------------------
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 [16]
0.00 0.00 20934/26801 ajouter [17]
-----------------------------------------------
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]
-----------------------------------------------
Index by function name
[8] _init [18] copier [23] generer_texte
[17] ajouter [20] decouper_lignes [24] generer_vocabulaire
[16] alea [4] doit_echanger [14] hacher_mot
[10] analyser_bigrammes [21] ecart_type_longueur [25] longueur_moyenne
[12] chercher_mot [9] egales [11] normaliser_ligne
[6] comparer [22] empreinte [26] racine
[13] compter_mot [15] en_minuscule [2] trier_entrees
[3] compter_mots_ligne [7] est_lettre
[19] construire_rapport [5] est_mot_vide
+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
61.33 0.46 0.46 1599863 0.00 0.00 longueur
12.00 0.55 0.09 9860216 0.00 0.00 comparer
8.00 0.61 0.06 1 60.00 164.31 trier_entrees
4.00 0.64 0.03 17202045 0.00 0.00 doit_echanger
4.00 0.67 0.03 12045671 0.00 0.00 egales
4.00 0.70 0.03 150182 0.00 0.00 compter_mot
1.33 0.71 0.01 5297256 0.00 0.00 est_lettre
1.33 0.72 0.01 250000 0.00 0.00 est_mot_vide
1.33 0.73 0.01 150182 0.00 0.00 chercher_mot
1.33 0.74 0.01 1 10.00 17.09 analyser_bigrammes
1.33 0.75 0.01 1 10.00 10.00 generer_texte
0.00 0.75 0.00 1266663 0.00 0.00 en_minuscule
0.00 0.75 0.00 928117 0.00 0.00 alea
0.00 0.75 0.00 32667 0.00 0.00 copier
0.00 0.75 0.00 26801 0.00 0.00 ajouter
0.00 0.75 0.00 21746 0.00 0.00 compter_mots_ligne
0.00 0.75 0.00 21746 0.00 0.02 normaliser_ligne
0.00 0.75 0.00 1 0.00 1.69 construire_rapport
0.00 0.75 0.00 1 0.00 0.00 decouper_lignes
0.00 0.75 0.00 1 0.00 1.69 ecart_type_longueur
0.00 0.75 0.00 1 0.00 0.00 empreinte
0.00 0.75 0.00 1 0.00 6.02 generer_vocabulaire
0.00 0.75 0.00 1 0.00 1.69 longueur_moyenne
0.00 0.75 0.00 1 0.00 0.00 racine
Call graph
granularity: each sample hit covers 4 byte(s) for 1.33% of 0.75 seconds
index % time self children called name
<spontaneous>
[1] 100.0 0.00 0.75 main [1]
0.00 0.45 21746/21746 normaliser_ligne [3]
0.06 0.10 1/1 trier_entrees [4]
0.00 0.10 21746/21746 compter_mots_ligne [6]
0.01 0.01 1/1 analyser_bigrammes [12]
0.01 0.00 1/1 generer_texte [14]
0.00 0.01 1/1 generer_vocabulaire [16]
0.00 0.00 1/1 construire_rapport [17]
0.00 0.00 1/1 longueur_moyenne [19]
0.00 0.00 1/1 ecart_type_longueur [18]
0.00 0.00 1/1 decouper_lignes [23]
0.00 0.00 1/1 racine [25]
0.00 0.00 1/1 empreinte [24]
-----------------------------------------------
0.00 0.00 5866/1599863 longueur_moyenne [19]
0.00 0.00 5866/1599863 ecart_type_longueur [18]
0.01 0.00 26801/1599863 ajouter [15]
0.45 0.00 1561330/1599863 normaliser_ligne [3]
[2] 61.3 0.46 0.00 1599863 longueur [2]
-----------------------------------------------
0.00 0.45 21746/21746 main [1]
[3] 60.2 0.00 0.45 21746 normaliser_ligne [3]
0.45 0.00 1561330/1599863 longueur [2]
0.00 0.00 1539584/5297256 est_lettre [13]
0.00 0.00 1266663/1266663 en_minuscule [20]
-----------------------------------------------
0.06 0.10 1/1 main [1]
[4] 21.9 0.06 0.10 1 trier_entrees [4]
0.03 0.07 17202045/17202045 doit_echanger [5]
-----------------------------------------------
0.03 0.07 17202045/17202045 trier_entrees [4]
[5] 13.9 0.03 0.07 17202045 doit_echanger [5]
0.07 0.00 8141769/9860216 comparer [7]
-----------------------------------------------
0.00 0.10 21746/21746 main [1]
[6] 12.8 0.00 0.10 21746 compter_mots_ligne [6]
0.03 0.03 150182/150182 compter_mot [8]
0.01 0.03 250000/250000 est_mot_vide [9]
-----------------------------------------------
0.02 0.00 1718447/9860216 chercher_mot [11]
0.07 0.00 8141769/9860216 doit_echanger [5]
[7] 12.0 0.09 0.00 9860216 comparer [7]
-----------------------------------------------
0.03 0.03 150182/150182 compter_mots_ligne [6]
[8] 7.4 0.03 0.03 150182 compter_mot [8]
0.01 0.02 150182/150182 chercher_mot [11]
0.00 0.00 5866/32667 copier [22]
-----------------------------------------------
0.01 0.03 250000/250000 compter_mots_ligne [6]
[9] 5.3 0.01 0.03 250000 est_mot_vide [9]
0.03 0.00 12045671/12045671 egales [10]
-----------------------------------------------
0.03 0.00 12045671/12045671 est_mot_vide [9]
[10] 4.0 0.03 0.00 12045671 egales [10]
-----------------------------------------------
0.01 0.02 150182/150182 compter_mot [8]
[11] 3.4 0.01 0.02 150182 chercher_mot [11]
0.02 0.00 1718447/9860216 comparer [7]
-----------------------------------------------
0.01 0.01 1/1 main [1]
[12] 2.3 0.01 0.01 1 analyser_bigrammes [12]
0.01 0.00 3757672/5297256 est_lettre [13]
-----------------------------------------------
0.00 0.00 1539584/5297256 normaliser_ligne [3]
0.01 0.00 3757672/5297256 analyser_bigrammes [12]
[13] 1.3 0.01 0.00 5297256 est_lettre [13]
-----------------------------------------------
0.01 0.00 1/1 main [1]
[14] 1.3 0.01 0.00 1 generer_texte [14]
0.00 0.00 900183/928117 alea [21]
-----------------------------------------------
0.00 0.00 5867/26801 construire_rapport [17]
0.00 0.01 20934/26801 generer_vocabulaire [16]
[15] 1.0 0.00 0.01 26801 ajouter [15]
0.01 0.00 26801/1599863 longueur [2]
0.00 0.00 26801/32667 copier [22]
-----------------------------------------------
0.00 0.01 1/1 main [1]
[16] 0.8 0.00 0.01 1 generer_vocabulaire [16]
0.00 0.01 20934/26801 ajouter [15]
0.00 0.00 27934/928117 alea [21]
-----------------------------------------------
0.00 0.00 1/1 main [1]
[17] 0.2 0.00 0.00 1 construire_rapport [17]
0.00 0.00 5867/26801 ajouter [15]
-----------------------------------------------
0.00 0.00 1/1 main [1]
[18] 0.2 0.00 0.00 1 ecart_type_longueur [18]
0.00 0.00 5866/1599863 longueur [2]
-----------------------------------------------
0.00 0.00 1/1 main [1]
[19] 0.2 0.00 0.00 1 longueur_moyenne [19]
0.00 0.00 5866/1599863 longueur [2]
-----------------------------------------------
0.00 0.00 1266663/1266663 normaliser_ligne [3]
[20] 0.0 0.00 0.00 1266663 en_minuscule [20]
-----------------------------------------------
0.00 0.00 27934/928117 generer_vocabulaire [16]
0.00 0.00 900183/928117 generer_texte [14]
[21] 0.0 0.00 0.00 928117 alea [21]
-----------------------------------------------
0.00 0.00 5866/32667 compter_mot [8]
0.00 0.00 26801/32667 ajouter [15]
[22] 0.0 0.00 0.00 32667 copier [22]
-----------------------------------------------
0.00 0.00 1/1 main [1]
[23] 0.0 0.00 0.00 1 decouper_lignes [23]
-----------------------------------------------
0.00 0.00 1/1 main [1]
[24] 0.0 0.00 0.00 1 empreinte [24]
-----------------------------------------------
0.00 0.00 1/1 main [1]
[25] 0.0 0.00 0.00 1 racine [25]
-----------------------------------------------
Index by function name
[15] ajouter [22] copier [9] est_mot_vide
[21] alea [23] decouper_lignes [14] generer_texte
[12] analyser_bigrammes [5] doit_echanger [16] generer_vocabulaire
[11] chercher_mot [18] ecart_type_longueur [2] longueur
[7] comparer [10] egales [19] longueur_moyenne
[8] compter_mot [24] empreinte [3] normaliser_ligne
[6] compter_mots_ligne [20] en_minuscule [25] racine
[17] construire_rapport [13] est_lettre [4] trier_entrees
+160
View File
@@ -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
45.45 0.05 0.05 12198772 0.00 0.00 egales
18.18 0.07 0.02 1 20.00 27.09 analyser_bigrammes
9.09 0.08 0.01 5297256 0.00 0.00 est_lettre
9.09 0.09 0.01 1266663 0.00 0.00 en_minuscule
9.09 0.10 0.01 250000 0.00 0.00 est_mot_vide
9.09 0.11 0.01 1 10.00 10.00 decouper_lignes
0.00 0.11 0.00 928117 0.00 0.00 alea
0.00 0.11 0.00 150182 0.00 0.00 chercher_mot
0.00 0.11 0.00 150182 0.00 0.00 compter_mot
0.00 0.11 0.00 150182 0.00 0.00 hacher_mot
0.00 0.11 0.00 129602 0.00 0.00 doit_echanger
0.00 0.11 0.00 32813 0.00 0.00 comparer
0.00 0.11 0.00 26801 0.00 0.00 ajouter
0.00 0.11 0.00 21746 0.00 0.00 compter_mots_ligne
0.00 0.11 0.00 21746 0.00 0.00 normaliser_ligne
0.00 0.11 0.00 8798 0.00 0.00 retablir_tas
0.00 0.11 0.00 5866 0.00 0.00 copier
0.00 0.11 0.00 1 0.00 0.00 construire_rapport
0.00 0.11 0.00 1 0.00 0.00 ecart_type_longueur
0.00 0.11 0.00 1 0.00 0.00 empreinte
0.00 0.11 0.00 1 0.00 0.00 generer_texte
0.00 0.11 0.00 1 0.00 0.00 generer_vocabulaire
0.00 0.11 0.00 1 0.00 0.00 longueur_moyenne
0.00 0.11 0.00 1 0.00 0.00 racine
0.00 0.11 0.00 1 0.00 0.00 trier_entrees
Call graph
granularity: each sample hit covers 4 byte(s) for 9.09% of 0.11 seconds
index % time self children called name
<spontaneous>
[1] 100.0 0.00 0.11 main [1]
0.00 0.06 21746/21746 compter_mots_ligne [2]
0.02 0.01 1/1 analyser_bigrammes [5]
0.00 0.01 21746/21746 normaliser_ligne [6]
0.01 0.00 1/1 decouper_lignes [9]
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 [26]
0.00 0.00 1/1 longueur_moyenne [24]
0.00 0.00 1/1 ecart_type_longueur [20]
0.00 0.00 1/1 racine [25]
0.00 0.00 1/1 construire_rapport [19]
0.00 0.00 1/1 empreinte [21]
-----------------------------------------------
0.00 0.06 21746/21746 main [1]
[2] 54.5 0.00 0.06 21746 compter_mots_ligne [2]
0.01 0.05 250000/250000 est_mot_vide [3]
0.00 0.00 150182/150182 compter_mot [11]
-----------------------------------------------
0.01 0.05 250000/250000 compter_mots_ligne [2]
[3] 54.0 0.01 0.05 250000 est_mot_vide [3]
0.05 0.00 12045671/12198772 egales [4]
-----------------------------------------------
0.00 0.00 153101/12198772 chercher_mot [10]
0.05 0.00 12045671/12198772 est_mot_vide [3]
[4] 45.5 0.05 0.00 12198772 egales [4]
-----------------------------------------------
0.02 0.01 1/1 main [1]
[5] 24.6 0.02 0.01 1 analyser_bigrammes [5]
0.01 0.00 3757672/5297256 est_lettre [7]
-----------------------------------------------
0.00 0.01 21746/21746 main [1]
[6] 11.7 0.00 0.01 21746 normaliser_ligne [6]
0.01 0.00 1266663/1266663 en_minuscule [8]
0.00 0.00 1539584/5297256 est_lettre [7]
-----------------------------------------------
0.00 0.00 1539584/5297256 normaliser_ligne [6]
0.01 0.00 3757672/5297256 analyser_bigrammes [5]
[7] 9.1 0.01 0.00 5297256 est_lettre [7]
-----------------------------------------------
0.01 0.00 1266663/1266663 normaliser_ligne [6]
[8] 9.1 0.01 0.00 1266663 en_minuscule [8]
-----------------------------------------------
0.01 0.00 1/1 main [1]
[9] 9.1 0.01 0.00 1 decouper_lignes [9]
-----------------------------------------------
0.00 0.00 150182/150182 compter_mot [11]
[10] 0.6 0.00 0.00 150182 chercher_mot [10]
0.00 0.00 153101/12198772 egales [4]
0.00 0.00 150182/150182 hacher_mot [13]
-----------------------------------------------
0.00 0.00 150182/150182 compter_mots_ligne [2]
[11] 0.6 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 27934/928117 generer_vocabulaire [23]
0.00 0.00 900183/928117 generer_texte [22]
[12] 0.0 0.00 0.00 928117 alea [12]
-----------------------------------------------
0.00 0.00 150182/150182 chercher_mot [10]
[13] 0.0 0.00 0.00 150182 hacher_mot [13]
-----------------------------------------------
0.00 0.00 129602/129602 retablir_tas [17]
[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 [19]
0.00 0.00 20934/26801 generer_vocabulaire [23]
[16] 0.0 0.00 0.00 26801 ajouter [16]
-----------------------------------------------
0.00 0.00 8798/8798 trier_entrees [26]
[17] 0.0 0.00 0.00 8798 retablir_tas [17]
0.00 0.00 129602/129602 doit_echanger [14]
-----------------------------------------------
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 [16]
-----------------------------------------------
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 [12]
-----------------------------------------------
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 [12]
0.00 0.00 20934/26801 ajouter [16]
-----------------------------------------------
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 8798/8798 retablir_tas [17]
-----------------------------------------------
Index by function name
[16] ajouter [9] decouper_lignes [23] generer_vocabulaire
[12] alea [14] doit_echanger [13] hacher_mot
[5] analyser_bigrammes [20] ecart_type_longueur [24] longueur_moyenne
[10] chercher_mot [4] egales [6] normaliser_ligne
[15] comparer [21] empreinte [25] racine
[11] compter_mot [8] en_minuscule [17] retablir_tas
[2] compter_mots_ligne [7] est_lettre [26] trier_entrees
[19] construire_rapport [3] est_mot_vide
[18] copier [22] generer_texte
+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
36.36 0.76 0.76 36 009 819 0.00 0.00 longueur
26.32 1.31 0.55 308 701 874 0.00 0.00 egales
18.18 1.69 0.38 150 182 0.00 0.01 chercher_mot
5.26 1.80 0.11 1 110.00 180.00 trier_entrees
3.35 1.87 0.07 12 172 087 0.00 0.00 comparer
3.35 1.94 0.07 5867 0.01 0.14 longueur_moyenne
1.91 1.98 0.04 _init
1.44 2.01 0.03 32 667 0.00 0.00 copier
0.96 2.03 0.02 250 000 0.00 0.00 est_mot_vide
0.48 2.04 0.01 5 297 256 0.00 0.00 est_lettre
0.48 2.05 0.01 928 117 0.00 0.00 alea
0.48 2.06 0.01 150 182 0.00 0.01 compter_mot
0.48 2.07 0.01 21 746 0.00 0.04 compter_mots_ligne
0.48 2.08 0.01 21 746 0.00 0.00 normaliser_ligne
0.48 2.09 0.01 1 10.00 17.09 analyser_bigrammes
0.00 2.09 0.00 17 202 045 0.00 0.00 doit_echanger
0.00 2.09 0.00 1 266 663 0.00 0.00 en_minuscule
0.00 2.09 0.00 26 801 0.00 0.00 ajouter
0.00 2.09 0.00 1 0.00 5.51 construire_rapport
0.00 2.09 0.00 1 0.00 0.00 decouper_lignes
0.00 2.09 0.00 1 0.00 796.35 ecart_type_longueur
0.00 2.09 0.00 1 0.00 0.00 empreinte
0.00 2.09 0.00 1 0.00 9.70 generer_texte
0.00 2.09 0.00 1 0.00 19.97 generer_vocabulaire
0.00 2.09 0.00 1 0.00 0.00 racine
Call graph
granularity: each sample hit covers 4 byte(s) for 0.48% of 2.09 seconds
index % time self children called name
<spontaneous>
[1] 98.1 0.00 2.05 main [1]
0.01 0.97 21746/21746 compter_mots_ligne [2]
0.00 0.80 1/1 ecart_type_longueur [6]
0.11 0.07 1/1 trier_entrees [9]
0.01 0.04 21746/21746 normaliser_ligne [12]
0.00 0.02 1/1 generer_vocabulaire [17]
0.01 0.01 1/1 analyser_bigrammes [18]
0.00 0.01 1/1 generer_texte [21]
0.00 0.01 1/1 construire_rapport [22]
0.00 0.00 1/5867 longueur_moyenne [5]
0.00 0.00 1/1 decouper_lignes [24]
0.00 0.00 1/1 racine [26]
0.00 0.00 1/1 empreinte [25]
-----------------------------------------------
0.01 0.97 21746/21746 main [1]
[2] 46.7 0.01 0.97 21746 compter_mots_ligne [2]
0.01 0.91 150182/150182 compter_mot [3]
0.02 0.02 250000/250000 est_mot_vide [13]
-----------------------------------------------
0.01 0.91 150182/150182 compter_mots_ligne [2]
[3] 44.2 0.01 0.91 150182 compter_mot [3]
0.38 0.53 150182/150182 chercher_mot [4]
0.01 0.00 5866/32667 copier [15]
-----------------------------------------------
0.38 0.53 150182/150182 compter_mot [3]
[4] 43.5 0.38 0.53 150182 chercher_mot [4]
0.53 0.00 296656203/308701874 egales [8]
-----------------------------------------------
0.00 0.00 1/5867 main [1]
0.07 0.73 5866/5867 ecart_type_longueur [6]
[5] 38.1 0.07 0.73 5867 longueur_moyenne [5]
0.73 0.00 34415822/36009819 longueur [7]
-----------------------------------------------
0.00 0.80 1/1 main [1]
[6] 38.1 0.00 0.80 1 ecart_type_longueur [6]
0.07 0.73 5866/5867 longueur_moyenne [5]
0.00 0.00 5866/36009819 longueur [7]
-----------------------------------------------
0.00 0.00 5866/36009819 ecart_type_longueur [6]
0.00 0.00 26801/36009819 ajouter [16]
0.03 0.00 1561330/36009819 normaliser_ligne [12]
0.73 0.00 34415822/36009819 longueur_moyenne [5]
[7] 36.4 0.76 0.00 36009819 longueur [7]
-----------------------------------------------
0.02 0.00 12045671/308701874 est_mot_vide [13]
0.53 0.00 296656203/308701874 chercher_mot [4]
[8] 26.3 0.55 0.00 308701874 egales [8]
-----------------------------------------------
0.11 0.07 1/1 main [1]
[9] 8.6 0.11 0.07 1 trier_entrees [9]
0.00 0.07 17202045/17202045 doit_echanger [10]
-----------------------------------------------
0.00 0.07 17202045/17202045 trier_entrees [9]
[10] 3.3 0.00 0.07 17202045 doit_echanger [10]
0.07 0.00 12172087/12172087 comparer [11]
-----------------------------------------------
0.07 0.00 12172087/12172087 doit_echanger [10]
[11] 3.3 0.07 0.00 12172087 comparer [11]
-----------------------------------------------
0.01 0.04 21746/21746 main [1]
[12] 2.2 0.01 0.04 21746 normaliser_ligne [12]
0.03 0.00 1561330/36009819 longueur [7]
0.00 0.00 1539584/5297256 est_lettre [19]
0.00 0.00 1266663/1266663 en_minuscule [23]
-----------------------------------------------
0.02 0.02 250000/250000 compter_mots_ligne [2]
[13] 2.0 0.02 0.02 250000 est_mot_vide [13]
0.02 0.00 12045671/308701874 egales [8]
-----------------------------------------------
<spontaneous>
[14] 1.9 0.04 0.00 _init [14]
-----------------------------------------------
0.01 0.00 5866/32667 compter_mot [3]
0.02 0.00 26801/32667 ajouter [16]
[15] 1.4 0.03 0.00 32667 copier [15]
-----------------------------------------------
0.00 0.01 5867/26801 construire_rapport [22]
0.00 0.02 20934/26801 generer_vocabulaire [17]
[16] 1.2 0.00 0.03 26801 ajouter [16]
0.02 0.00 26801/32667 copier [15]
0.00 0.00 26801/36009819 longueur [7]
-----------------------------------------------
0.00 0.02 1/1 main [1]
[17] 1.0 0.00 0.02 1 generer_vocabulaire [17]
0.00 0.02 20934/26801 ajouter [16]
0.00 0.00 27934/928117 alea [20]
-----------------------------------------------
0.01 0.01 1/1 main [1]
[18] 0.8 0.01 0.01 1 analyser_bigrammes [18]
0.01 0.00 3757672/5297256 est_lettre [19]
-----------------------------------------------
0.00 0.00 1539584/5297256 normaliser_ligne [12]
0.01 0.00 3757672/5297256 analyser_bigrammes [18]
[19] 0.5 0.01 0.00 5297256 est_lettre [19]
-----------------------------------------------
0.00 0.00 27934/928117 generer_vocabulaire [17]
0.01 0.00 900183/928117 generer_texte [21]
[20] 0.5 0.01 0.00 928117 alea [20]
-----------------------------------------------
0.00 0.01 1/1 main [1]
[21] 0.5 0.00 0.01 1 generer_texte [21]
0.01 0.00 900183/928117 alea [20]
-----------------------------------------------
0.00 0.01 1/1 main [1]
[22] 0.3 0.00 0.01 1 construire_rapport [22]
0.00 0.01 5867/26801 ajouter [16]
-----------------------------------------------
0.00 0.00 1266663/1266663 normaliser_ligne [12]
[23] 0.0 0.00 0.00 1266663 en_minuscule [23]
-----------------------------------------------
0.00 0.00 1/1 main [1]
[24] 0.0 0.00 0.00 1 decouper_lignes [24]
-----------------------------------------------
0.00 0.00 1/1 main [1]
[25] 0.0 0.00 0.00 1 empreinte [25]
-----------------------------------------------
0.00 0.00 1/1 main [1]
[26] 0.0 0.00 0.00 1 racine [26]
-----------------------------------------------
Index by function name
[14] _init [15] copier [21] generer_texte
[16] ajouter [24] decouper_lignes [17] generer_vocabulaire
[20] alea [10] doit_echanger [7] longueur
[18] analyser_bigrammes [6] ecart_type_longueur [5] longueur_moyenne
[4] chercher_mot [8] egales [12] normaliser_ligne
[11] comparer [25] empreinte [26] racine
[3] compter_mot [23] en_minuscule [9] trier_entrees
[2] compter_mots_ligne [19] est_lettre
[22] construire_rapport [13] est_mot_vide
+5867
View File
File diff suppressed because it is too large Load Diff