Compare commits

..

2 Commits

Author SHA1 Message Date
Nathan Couchot e7f47e975f rendu 2026-10-07 12:05:55 +02:00
Nathan Couchot 7ab243f1d6 opti 2 2026-10-07 12:05:12 +02:00
4 changed files with 315 additions and 175 deletions
+118
View File
@@ -0,0 +1,118 @@
# Compte rendu — TD 1 : utilisation de gprof
### Nathan COUCHOT et Lucas POT
## 1. Mesurer le programme sans instrumentation
La mesure sans profiler se réalise avec les commandes suivantes, depuis le dossier du programme :
```bash
gcc -O0 analyseur.c -o analyseur
time ./analyseur
```
La nouvelle exécution sans `-pg`, sur le même volume de texte que le profil, donne :
| Mesure | Temps |
| --- | ---: |
| Temps réel (`real`) | 1,200 s |
| Temps CPU utilisateur (`user`) | 1,164 s |
| Temps CPU système (`sys`) | 0,022 s |
L'empreinte du rapport est **`03c7b78f93838d02`**. Cette empreinte sert de référence pour vérifier que le résultat reste identique lors d'une comparaison effectuée avec les mêmes données.
Les dix mots les plus fréquents sont :
| Rang | Mot | Occurrences |
| --- | --- | ---: |
| 1 | rane | 2 811 |
| 2 | fasi | 2 399 |
| 3 | mopo | 2 161 |
| 4 | tata | 2 086 |
| 5 | vesi | 1 979 |
| 6 | laganomo | 1 784 |
| 7 | boto | 1 697 |
| 8 | nopebo | 1 653 |
| 9 | cofi | 1 612 |
| 10 | siri | 1 593 |
## 2. Compiler avec `-pg` et produire le profil
Pour activer l'instrumentation de `gprof`, on compile avec `-O0 -pg`, puis on exécute le programme et on génère le profil :
```bash
gcc -O0 -pg analyseur.c -o analyseur
time ./analyseur
gprof ./analyseur gmon.out > profil_avant.txt
```
On passe d'une mesure de **1,200 s sans `-pg`** à un temps réel relevé de **2,750 s avec `-pg`**, soit une durée environ **2,29 fois plus longue** et un écart de **1,550 s** (environ **129 %** d'augmentation). Le profil affiche cependant seulement **0,91 s de temps effectif estimé dans les fonctions analysées**.
L'option `-pg` ajoute du travail à chaque entrée dans une fonction pour compter les appels. Avec des dizaines de millions d'appels à de petites fonctions, ce surcoût devient très important : le profiling perturbe donc fortement la durée d'exécution.
## 3. Analyser le profil plat et le graphe d'appels
### Profil plat : où passe le temps ?
Le profil plat indique le temps propre de chaque fonction, sans le temps de ses fonctions appelées. Les principaux résultats de `profil_avant.txt` sont :
| Fonction | Part du temps propre | Temps propre affiché | Nombre d'appels |
| --- | ---: | ---: | ---: |
| `egales` | 28,02 % | 0,26 s | 121 889 737 |
| `est_mot_vide` | 13,74 % | 0,12 s | 2 500 000 |
| `analyser_bigrammes` | 12,09 % | 0,11 s | 1 |
| `decouper_lignes` | 7,69 % | 0,07 s | 1 |
| `generer_texte` | 6,59 % | 0,06 s | 1 |
| `est_lettre` | 5,49 % | 0,05 s | 52 929 320 |
La fonction `egales` est le principal point chaud : elle compare des chaînes et représente environ 28 % du temps propre mesuré. Son coût vient surtout de son nombre d'appels, supérieur à 121 millions.
`analyser_bigrammes`, `decouper_lignes` et `generer_texte` ne sont appelées qu'une fois, mais parcourent de grandes quantités de données. Elles peuvent donc consommer un temps significatif malgré leur faible nombre d'appels.
### Graphe d'appels : pourquoi ces fonctions coûtent-elles du temps ?
`main` appelle `compter_mots_ligne`, qui vérifie chaque mot avec `est_mot_vide` avant de le compter. Cette étape représente environ **51 % du temps du profil**, fonctions appelées comprises.
Pour vérifier si un mot est vide, `est_mot_vide` le compare aux éléments d'une liste de 60 mots avec `egales`. Comme cette vérification est répétée pour les 2 500 000 mots du texte, elle entraîne plus de **120 millions de comparaisons** et représente environ **41 % du temps du profil**.
Le principal coût vient donc de la vérification des mots vides.
## 4. Proposer des améliorations
Les pistes suivantes sont classées par gain attendu :
1. **Optimiser `est_mot_vide`.** Regrouper les mots vides par longueur et première lettre éviterait de parcourir toute la liste et réduirait fortement les appels à `egales`.
2. **Optimiser `longueur_moyenne`.** Mémoriser la longueur des mots et réutiliser la moyenne dans `ecart_type_longueur` éviterait des parcours inutiles. Le gain attendu est plus faible.
## 5. Optimisations réalisées
Dans `est_mot_vide`, les 60 mots vides sont regroupés une seule fois par longueur et première lettre. Pour chaque mot du texte, seules les chaînes du groupe correspondant sont comparées avec `egales`. La longueur est déjà connue lors du découpage du mot.
La longueur de chaque mot compté est aussi mémorisée dans la table pour calculer les statistiques. La moyenne déjà calculée est transmise à `ecart_type_longueur` pour éviter de la recalculer.
## 6. Vérifier les résultats et mesurer le gain
Après compilation avec `gcc -O0 -pg analyseur.c -o analyseur`, deux exécutions donnent :
| Mesure | Après : essai 1 | Après : essai 2 |
| --- | ---: | ---: |
| Temps réel | 1,200 s | 1,231 s |
| Temps CPU utilisateur | 1,147 s | 1,183 s |
| Temps CPU système | 0,016 s | 0,019 s |
Le temps réel moyen avec `-pg` est de **1,216 s**, contre **2,750 s avant optimisation**, soit environ **55,8 % de temps en moins** et une exécution **2,26 fois plus rapide**. Cette comparaison concerne les versions instrumentées : elle inclut la réduction du surcoût de `-pg` grâce aux appels supprimés.
La comparaison de `profil_avant.txt` et `profil_après.txt` confirme la réduction du travail :
| Mesure du profil | Avant | Après |
| --- | ---: | ---: |
| Temps total estimé par `gprof` | 0,91 s | 0,45 s |
| Appels à `egales` | 121 889 737 | 3 413 876 |
| Temps propre de `egales` | 0,26 s | 0,02 s |
| Temps propre de `est_mot_vide` | 0,12 s | 0,02 s |
| Appels à `longueur` | 39 162 | 20 994 |
| Appels à `longueur_moyenne` | 2 | 1 |
Les appels à `egales` diminuent d'environ **97 %**. Les 60 appels à `longueur` ajoutés par l'initialisation des groupes expliquent le passage de 20 934 appels après la seule optimisation des statistiques à 20 994 dans la version finale.
L'empreinte reste **`03c7b78f93838d02`** dans les deux exécutions. Le Top 10 et les statistiques affichées restent identiques.
+24 -4
View File
@@ -228,10 +228,30 @@ typedef struct {
int longueur_mot;
} Entree;
int est_mot_vide(const char *mot)
/* Groupes par longueur et première lettre ; indices + 1, zéro = fin. */
int est_mot_vide(const char *mot, int taille)
{
for (int i = 0; i < NB_MOTS_VIDES; i++) {
if (egales(mot, MOTS_VIDES[i]))
static int groupes[TAILLE_MOT][26];
static int suivants[NB_MOTS_VIDES];
static int initialise = 0;
if (!initialise) {
for (int i = 0; i < NB_MOTS_VIDES; i++) {
int n = longueur(MOTS_VIDES[i]);
int lettre = MOTS_VIDES[i][0] - 'a';
if (n > 0 && n < TAILLE_MOT && lettre >= 0 && lettre < 26) {
suivants[i] = groupes[n][lettre];
groupes[n][lettre] = i + 1;
}
}
initialise = 1;
}
if (taille <= 0 || taille >= TAILLE_MOT || mot[0] < 'a' || mot[0] > 'z')
return 0;
for (int indice = groupes[taille][mot[0] - 'a']; indice != 0;
indice = suivants[indice - 1]) {
if (egales(mot, MOTS_VIDES[indice - 1]))
return 1;
}
return 0;
@@ -303,7 +323,7 @@ void compter_mots_ligne(Entree *table, int *nb_entrees, const char *ligne,
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, mot, k);
}
}
-171
View File
@@ -1,171 +0,0 @@
Flat profile:
Each sample counts as 0.01 seconds.
% cumulative self self total
time seconds seconds calls ms/call ms/call name
28.85 0.23 0.23 121889737 0.00 0.00 egales
15.38 0.34 0.12 2500000 0.00 0.00 est_mot_vide
10.26 0.42 0.08 52929320 0.00 0.00 est_lettre
8.97 0.49 0.07 217318 0.00 0.00 compter_mots_ligne
7.69 0.56 0.06 1 60.00 69.97 generer_texte
5.13 0.59 0.04 1499989 0.00 0.00 hacher_mot
5.13 0.64 0.04 1 40.00 96.75 analyser_bigrammes
5.13 0.68 0.04 1 40.00 40.00 decouper_lignes
2.56 0.69 0.02 1499989 0.00 0.00 compter_mot
2.56 0.71 0.02 217318 0.00 0.00 normaliser_ligne
2.56 0.73 0.02 _init
1.92 0.75 0.01 15787 0.00 0.00 comparer
1.28 0.76 0.01 12656214 0.00 0.00 en_minuscule
1.28 0.77 0.01 9027924 0.00 0.00 alea
1.28 0.78 0.01 1499989 0.00 0.00 chercher_mot
0.00 0.78 0.00 68597 0.00 0.00 doit_echanger
0.00 0.78 0.00 27010 0.00 0.00 copier
0.00 0.78 0.00 20934 0.00 0.00 ajouter
0.00 0.78 0.00 20934 0.00 0.00 longueur
0.00 0.78 0.00 1 0.00 0.00 construire_rapport
0.00 0.78 0.00 1 0.00 0.00 ecart_type_longueur
0.00 0.78 0.00 1 0.00 0.00 empreinte
0.00 0.78 0.00 1 0.00 15.00 fusionner_entrees
0.00 0.78 0.00 1 0.00 0.03 generer_vocabulaire
0.00 0.78 0.00 1 0.00 0.00 longueur_moyenne
0.00 0.78 0.00 1 0.00 0.00 racine
0.00 0.78 0.00 1 0.00 15.00 trier_entrees
Call graph
granularity: each sample hit covers 4 byte(s) for 1.28% of 0.78 seconds
index % time self children called name
<spontaneous>
[1] 97.4 0.00 0.76 main [1]
0.07 0.41 217318/217318 compter_mots_ligne [2]
0.04 0.06 1/1 analyser_bigrammes [5]
0.06 0.01 1/1 generer_texte [8]
0.02 0.03 217318/217318 normaliser_ligne [9]
0.04 0.00 1/1 decouper_lignes [12]
0.00 0.01 1/1 trier_entrees [17]
0.00 0.00 1/1 generer_vocabulaire [20]
0.00 0.00 1/1 longueur_moyenne [27]
0.00 0.00 1/1 ecart_type_longueur [25]
0.00 0.00 1/1 racine [28]
0.00 0.00 1/1 construire_rapport [24]
0.00 0.00 1/1 empreinte [26]
-----------------------------------------------
0.07 0.41 217318/217318 main [1]
[2] 62.2 0.07 0.41 217318 compter_mots_ligne [2]
0.12 0.22 2500000/2500000 est_mot_vide [3]
0.02 0.05 1499989/1499989 compter_mot [7]
-----------------------------------------------
0.12 0.22 2500000/2500000 compter_mots_ligne [2]
[3] 43.9 0.12 0.22 2500000 est_mot_vide [3]
0.22 0.00 120340526/121889737 egales [4]
-----------------------------------------------
0.00 0.00 1549211/121889737 chercher_mot [10]
0.22 0.00 120340526/121889737 est_mot_vide [3]
[4] 28.8 0.23 0.00 121889737 egales [4]
-----------------------------------------------
0.04 0.06 1/1 main [1]
[5] 12.4 0.04 0.06 1 analyser_bigrammes [5]
0.06 0.00 37544897/52929320 est_lettre [6]
-----------------------------------------------
0.02 0.00 15384423/52929320 normaliser_ligne [9]
0.06 0.00 37544897/52929320 analyser_bigrammes [5]
[6] 10.3 0.08 0.00 52929320 est_lettre [6]
-----------------------------------------------
0.02 0.05 1499989/1499989 compter_mots_ligne [2]
[7] 9.3 0.02 0.05 1499989 compter_mot [7]
0.01 0.04 1499989/1499989 chercher_mot [10]
0.00 0.00 6076/27010 copier [21]
-----------------------------------------------
0.06 0.01 1/1 main [1]
[8] 9.0 0.06 0.01 1 generer_texte [8]
0.01 0.00 8999990/9027924 alea [19]
-----------------------------------------------
0.02 0.03 217318/217318 main [1]
[9] 6.8 0.02 0.03 217318 normaliser_ligne [9]
0.02 0.00 15384423/52929320 est_lettre [6]
0.01 0.00 12656214/12656214 en_minuscule [18]
-----------------------------------------------
0.01 0.04 1499989/1499989 compter_mot [7]
[10] 6.8 0.01 0.04 1499989 chercher_mot [10]
0.04 0.00 1499989/1499989 hacher_mot [11]
0.00 0.00 1549211/121889737 egales [4]
-----------------------------------------------
0.04 0.00 1499989/1499989 chercher_mot [10]
[11] 5.1 0.04 0.00 1499989 hacher_mot [11]
-----------------------------------------------
0.04 0.00 1/1 main [1]
[12] 5.1 0.04 0.00 1 decouper_lignes [12]
-----------------------------------------------
<spontaneous>
[13] 2.6 0.02 0.00 _init [13]
-----------------------------------------------
0.00 0.01 68597/68597 fusionner_entrees [16]
[14] 1.9 0.00 0.01 68597 doit_echanger [14]
0.01 0.00 15787/15787 comparer [15]
-----------------------------------------------
0.01 0.00 15787/15787 doit_echanger [14]
[15] 1.9 0.01 0.00 15787 comparer [15]
-----------------------------------------------
12150 fusionner_entrees [16]
0.00 0.01 1/1 trier_entrees [17]
[16] 1.9 0.00 0.01 1+12150 fusionner_entrees [16]
0.00 0.01 68597/68597 doit_echanger [14]
12150 fusionner_entrees [16]
-----------------------------------------------
0.00 0.01 1/1 main [1]
[17] 1.9 0.00 0.01 1 trier_entrees [17]
0.00 0.01 1/1 fusionner_entrees [16]
-----------------------------------------------
0.01 0.00 12656214/12656214 normaliser_ligne [9]
[18] 1.3 0.01 0.00 12656214 en_minuscule [18]
-----------------------------------------------
0.00 0.00 27934/9027924 generer_vocabulaire [20]
0.01 0.00 8999990/9027924 generer_texte [8]
[19] 1.3 0.01 0.00 9027924 alea [19]
-----------------------------------------------
0.00 0.00 1/1 main [1]
[20] 0.0 0.00 0.00 1 generer_vocabulaire [20]
0.00 0.00 27934/9027924 alea [19]
0.00 0.00 20934/20934 ajouter [22]
-----------------------------------------------
0.00 0.00 6076/27010 compter_mot [7]
0.00 0.00 20934/27010 ajouter [22]
[21] 0.0 0.00 0.00 27010 copier [21]
-----------------------------------------------
0.00 0.00 20934/20934 generer_vocabulaire [20]
[22] 0.0 0.00 0.00 20934 ajouter [22]
0.00 0.00 20934/20934 longueur [23]
0.00 0.00 20934/27010 copier [21]
-----------------------------------------------
0.00 0.00 20934/20934 ajouter [22]
[23] 0.0 0.00 0.00 20934 longueur [23]
-----------------------------------------------
0.00 0.00 1/1 main [1]
[24] 0.0 0.00 0.00 1 construire_rapport [24]
-----------------------------------------------
0.00 0.00 1/1 main [1]
[25] 0.0 0.00 0.00 1 ecart_type_longueur [25]
-----------------------------------------------
0.00 0.00 1/1 main [1]
[26] 0.0 0.00 0.00 1 empreinte [26]
-----------------------------------------------
0.00 0.00 1/1 main [1]
[27] 0.0 0.00 0.00 1 longueur_moyenne [27]
-----------------------------------------------
0.00 0.00 1/1 main [1]
[28] 0.0 0.00 0.00 1 racine [28]
-----------------------------------------------
Index by function name
[13] _init [21] copier [16] fusionner_entrees
[22] ajouter [12] decouper_lignes [8] generer_texte
[19] alea [14] doit_echanger [20] generer_vocabulaire
[5] analyser_bigrammes [25] ecart_type_longueur [11] hacher_mot
[10] chercher_mot [4] egales [23] longueur
[15] comparer [26] empreinte [27] longueur_moyenne
[7] compter_mot [18] en_minuscule [9] normaliser_ligne
[2] compter_mots_ligne [6] est_lettre [28] racine
[24] construire_rapport [3] est_mot_vide [17] trier_entrees
+173
View File
@@ -0,0 +1,173 @@
Flat profile:
Each sample counts as 0.01 seconds.
% cumulative self self total
time seconds seconds calls ms/call ms/call name
17.78 0.08 0.08 1 80.00 108.37 analyser_bigrammes
13.33 0.14 0.06 217318 0.00 0.00 compter_mots_ligne
13.33 0.20 0.06 1 60.00 60.00 decouper_lignes
8.89 0.24 0.04 52929320 0.00 0.00 est_lettre
8.89 0.28 0.04 1 40.00 49.97 generer_texte
8.89 0.32 0.04 _init
6.67 0.35 0.03 217318 0.00 0.00 normaliser_ligne
4.44 0.37 0.02 12656214 0.00 0.00 en_minuscule
4.44 0.39 0.02 3413876 0.00 0.00 egales
4.44 0.41 0.02 2500000 0.00 0.00 est_mot_vide
2.22 0.42 0.01 9027924 0.00 0.00 alea
2.22 0.43 0.01 1499989 0.00 0.00 compter_mot
2.22 0.44 0.01 1499989 0.00 0.00 hacher_mot
2.22 0.45 0.01 1 10.00 10.00 fusionner_entrees
0.00 0.45 0.00 1499989 0.00 0.00 chercher_mot
0.00 0.45 0.00 68597 0.00 0.00 doit_echanger
0.00 0.45 0.00 27010 0.00 0.00 copier
0.00 0.45 0.00 20994 0.00 0.00 longueur
0.00 0.45 0.00 20934 0.00 0.00 ajouter
0.00 0.45 0.00 15787 0.00 0.00 comparer
0.00 0.45 0.00 1 0.00 0.00 construire_rapport
0.00 0.45 0.00 1 0.00 0.00 ecart_type_longueur
0.00 0.45 0.00 1 0.00 0.00 empreinte
0.00 0.45 0.00 1 0.00 0.03 generer_vocabulaire
0.00 0.45 0.00 1 0.00 0.00 longueur_moyenne
0.00 0.45 0.00 1 0.00 0.00 racine
0.00 0.45 0.00 1 0.00 10.00 trier_entrees
Call graph
granularity: each sample hit covers 4 byte(s) for 2.22% of 0.45 seconds
index % time self children called name
<spontaneous>
[1] 91.1 0.00 0.41 main [1]
0.06 0.06 217318/217318 compter_mots_ligne [2]
0.08 0.03 1/1 analyser_bigrammes [3]
0.03 0.03 217318/217318 normaliser_ligne [4]
0.06 0.00 1/1 decouper_lignes [5]
0.04 0.01 1/1 generer_texte [6]
0.00 0.01 1/1 trier_entrees [17]
0.00 0.00 1/1 generer_vocabulaire [18]
0.00 0.00 1/1 longueur_moyenne [27]
0.00 0.00 1/1 ecart_type_longueur [25]
0.00 0.00 1/1 racine [28]
0.00 0.00 1/1 construire_rapport [24]
0.00 0.00 1/1 empreinte [26]
-----------------------------------------------
0.06 0.06 217318/217318 main [1]
[2] 26.7 0.06 0.06 217318 compter_mots_ligne [2]
0.02 0.01 2500000/2500000 est_mot_vide [9]
0.01 0.02 1499989/1499989 compter_mot [10]
-----------------------------------------------
0.08 0.03 1/1 main [1]
[3] 24.1 0.08 0.03 1 analyser_bigrammes [3]
0.03 0.00 37544897/52929320 est_lettre [7]
-----------------------------------------------
0.03 0.03 217318/217318 main [1]
[4] 13.7 0.03 0.03 217318 normaliser_ligne [4]
0.02 0.00 12656214/12656214 en_minuscule [11]
0.01 0.00 15384423/52929320 est_lettre [7]
-----------------------------------------------
0.06 0.00 1/1 main [1]
[5] 13.3 0.06 0.00 1 decouper_lignes [5]
-----------------------------------------------
0.04 0.01 1/1 main [1]
[6] 11.1 0.04 0.01 1 generer_texte [6]
0.01 0.00 8999990/9027924 alea [14]
-----------------------------------------------
0.01 0.00 15384423/52929320 normaliser_ligne [4]
0.03 0.00 37544897/52929320 analyser_bigrammes [3]
[7] 8.9 0.04 0.00 52929320 est_lettre [7]
-----------------------------------------------
<spontaneous>
[8] 8.9 0.04 0.00 _init [8]
-----------------------------------------------
0.02 0.01 2500000/2500000 compter_mots_ligne [2]
[9] 6.9 0.02 0.01 2500000 est_mot_vide [9]
0.01 0.00 1864665/3413876 egales [12]
0.00 0.00 60/20994 longueur [21]
-----------------------------------------------
0.01 0.02 1499989/1499989 compter_mots_ligne [2]
[10] 6.5 0.01 0.02 1499989 compter_mot [10]
0.00 0.02 1499989/1499989 chercher_mot [13]
0.00 0.00 6076/27010 copier [20]
-----------------------------------------------
0.02 0.00 12656214/12656214 normaliser_ligne [4]
[11] 4.4 0.02 0.00 12656214 en_minuscule [11]
-----------------------------------------------
0.01 0.00 1549211/3413876 chercher_mot [13]
0.01 0.00 1864665/3413876 est_mot_vide [9]
[12] 4.4 0.02 0.00 3413876 egales [12]
-----------------------------------------------
0.00 0.02 1499989/1499989 compter_mot [10]
[13] 4.2 0.00 0.02 1499989 chercher_mot [13]
0.01 0.00 1499989/1499989 hacher_mot [15]
0.01 0.00 1549211/3413876 egales [12]
-----------------------------------------------
0.00 0.00 27934/9027924 generer_vocabulaire [18]
0.01 0.00 8999990/9027924 generer_texte [6]
[14] 2.2 0.01 0.00 9027924 alea [14]
-----------------------------------------------
0.01 0.00 1499989/1499989 chercher_mot [13]
[15] 2.2 0.01 0.00 1499989 hacher_mot [15]
-----------------------------------------------
12150 fusionner_entrees [16]
0.01 0.00 1/1 trier_entrees [17]
[16] 2.2 0.01 0.00 1+12150 fusionner_entrees [16]
0.00 0.00 68597/68597 doit_echanger [19]
12150 fusionner_entrees [16]
-----------------------------------------------
0.00 0.01 1/1 main [1]
[17] 2.2 0.00 0.01 1 trier_entrees [17]
0.01 0.00 1/1 fusionner_entrees [16]
-----------------------------------------------
0.00 0.00 1/1 main [1]
[18] 0.0 0.00 0.00 1 generer_vocabulaire [18]
0.00 0.00 27934/9027924 alea [14]
0.00 0.00 20934/20934 ajouter [22]
-----------------------------------------------
0.00 0.00 68597/68597 fusionner_entrees [16]
[19] 0.0 0.00 0.00 68597 doit_echanger [19]
0.00 0.00 15787/15787 comparer [23]
-----------------------------------------------
0.00 0.00 6076/27010 compter_mot [10]
0.00 0.00 20934/27010 ajouter [22]
[20] 0.0 0.00 0.00 27010 copier [20]
-----------------------------------------------
0.00 0.00 60/20994 est_mot_vide [9]
0.00 0.00 20934/20994 ajouter [22]
[21] 0.0 0.00 0.00 20994 longueur [21]
-----------------------------------------------
0.00 0.00 20934/20934 generer_vocabulaire [18]
[22] 0.0 0.00 0.00 20934 ajouter [22]
0.00 0.00 20934/20994 longueur [21]
0.00 0.00 20934/27010 copier [20]
-----------------------------------------------
0.00 0.00 15787/15787 doit_echanger [19]
[23] 0.0 0.00 0.00 15787 comparer [23]
-----------------------------------------------
0.00 0.00 1/1 main [1]
[24] 0.0 0.00 0.00 1 construire_rapport [24]
-----------------------------------------------
0.00 0.00 1/1 main [1]
[25] 0.0 0.00 0.00 1 ecart_type_longueur [25]
-----------------------------------------------
0.00 0.00 1/1 main [1]
[26] 0.0 0.00 0.00 1 empreinte [26]
-----------------------------------------------
0.00 0.00 1/1 main [1]
[27] 0.0 0.00 0.00 1 longueur_moyenne [27]
-----------------------------------------------
0.00 0.00 1/1 main [1]
[28] 0.0 0.00 0.00 1 racine [28]
-----------------------------------------------
Index by function name
[8] _init [20] copier [16] fusionner_entrees
[22] ajouter [5] decouper_lignes [6] generer_texte
[14] alea [19] doit_echanger [18] generer_vocabulaire
[3] analyser_bigrammes [25] ecart_type_longueur [15] hacher_mot
[13] chercher_mot [12] egales [21] longueur
[23] comparer [26] empreinte [27] longueur_moyenne
[10] compter_mot [11] en_minuscule [4] normaliser_ligne
[2] compter_mots_ligne [7] est_lettre [28] racine
[24] construire_rapport [9] est_mot_vide [17] trier_entrees