2 Commits

Author SHA1 Message Date
abraham bf1396cbb7 travaille 2026-10-07 12:14:44 +02:00
abraham b2a9d097aa TD01 avec FRAMERY Karl 2026-10-07 12:09:12 +02:00
10 changed files with 6615 additions and 12 deletions
+123
View File
@@ -0,0 +1,123 @@
Groupe :
- FRAMERY Karl
- ABRAHAM Ozvann
1. Mesurer
[ozvann@archlinux 2026_TD1_DEV51_Qualite_Algo]$ time ./a.out
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 0m5,077s
user 0m5,058s
sys 0m0,004s
Le programme a pris 5.077 seconde a s'exécuter.
2. Profiler
[ozvann@archlinux 2026_TD1_DEV51_Qualite_Algo]$ 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 0m9,359s
user 0m9,326s
sys 0m0,004s
Le programme passe 9.359 seconde sur le programme au totale, c'est plus de 4 secondes de plus que l'étape 1.
3. Analyser
Pour le profil plat :
La fonction "egales" prend le plus de calls (308701874), pour un temps de 34.51%. La fonction "longueur" prend 36009819 calls, pour un temps de 29.20%. La fonction "chercher_mot" prend 150182, pour un temps de 13.27%.
Pour le graph d'appel :
On voit que longeur est appelé majoritairement par longeur_moyenne ou l'on peut juste se limiter a un seul appel de longeur. Pour chercher_mot est aussi un moyen d'amélioration. La fonction égale ne permet pas d'être amélioré car il n'a que le nécéssaire.
4. Proposer
On peut réduire l'utilisation de longeur a des appel réduit. On peut aussi réduire le temps utiliser par chercher_mot en le modifiants.
La fonction longeur risque d'avoir le changement le plus drastique (passage de plusieurs million d'appel a un seul). La fonction chercher_mot peut être amélioré (nous ne savons pas encore la porté du résultat de l'amélioration).
5. Optimiser
Nous avons optimisé le code sur deux points principaux :
- réduction des appels répétés à la fonction `longueur` : la moyenne est calculée une seule fois puis réutilisée dans le calcul de l'écart-type ;
- remplacement de la recherche linéaire dans `chercher_mot` par un index de hachage, ce qui permet de retrouver rapidement un mot déjà présent dans la table sans parcourir toutes les entrées.
La logique métier du programme n'a pas été modifiée : le traitement des mots, le tri, la génération du rapport et l'empreinte finale restent cohérents avec la version initiale. Les modifications visent uniquement à réduire le coût de calcul et améliorer le temps d'exécution.
Les changements ont été appliqués dans le fichier `analyseur.c`, notamment dans les fonctions `longueur_moyenne`, `ecart_type_longueur`, `chercher_mot`, `compter_mot` et `compter_mots_ligne`.
6. Valider
Avant optimisation, le programme prenait environ 9 secondes à s'exécuter, avec une empreinte du rapport de `1d53de903efd2b7c`.
Après optimisation, le temps d'exécution a été réduit à environ 2,171 secondes, tout en conservant la même empreinte de rapport : `1d53de903efd2b7c`.
Cette amélioration représente une réduction de plus de 7 secondes, ce qui confirme que les changements ont bien permis d'optimiser le code sans modifier le résultat final.
Les fichiers `profil-1.txt`, `profil-2.txt` et `profil-3.txt` correspondent respectivement à la version initiale, à la version après optimisation de la fonction `longueur`, puis à la version finale avec les améliorations complètes.
Executable
BIN
View File
Binary file not shown.
Executable
BIN
View File
Binary file not shown.
+42 -12
View File
@@ -26,6 +26,7 @@
#define NB_MOTS_VOCAB 7000
#define TAILLE_MOT 32
#define MAX_MOTS_UNIQUES 20000
#define TAILLE_HACHAGE 65536
#define GRAINE 20261006UL
/* ------------------------------------------------------------------------ */
@@ -235,29 +236,53 @@ int est_mot_vide(const char *mot)
return 0;
}
int chercher_mot(Entree *table, int nb_entrees, const char *mot)
unsigned long hacher_mot(const char *mot)
{
for (int i = 0; i < nb_entrees; i++) {
if (egales(table[i].mot, mot))
return i;
unsigned long h = 2166136261UL;
for (int i = 0; mot[i] != '\0'; i++) {
h ^= (unsigned char)mot[i];
h *= 16777619UL;
}
return h % TAILLE_HACHAGE;
}
int chercher_mot(const Entree *table, const int *index_mots, const char *mot,
int *position)
{
unsigned long case_hachage = hacher_mot(mot);
for (int i = 0; i < TAILLE_HACHAGE; i++) {
int indice = index_mots[case_hachage] - 1;
if (indice < 0) {
*position = (int)case_hachage;
return -1;
}
if (egales(table[indice].mot, mot)) {
*position = (int)case_hachage;
return indice;
}
case_hachage = (case_hachage + 1) % TAILLE_HACHAGE;
}
*position = -1;
return -1;
}
void compter_mot(Entree *table, int *nb_entrees, const char *mot)
void compter_mot(Entree *table, int *nb_entrees, int *index_mots,
const char *mot)
{
int indice = chercher_mot(table, *nb_entrees, mot);
int position;
int indice = chercher_mot(table, index_mots, mot, &position);
if (indice >= 0) {
table[indice].occurrences++;
} else {
} else if (position >= 0 && *nb_entrees < MAX_MOTS_UNIQUES) {
copier(table[*nb_entrees].mot, mot);
table[*nb_entrees].occurrences = 1;
index_mots[position] = *nb_entrees + 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 +300,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);
}
}
}
@@ -318,9 +343,11 @@ double longueur_moyenne(const Entree *table, int n)
double ecart_type_longueur(const Entree *table, int n)
{
double moyenne = longueur_moyenne(table, n);
double somme = 0.0;
for (int i = 0; i < n; i++) {
double ecart = longueur(table[i].mot) - longueur_moyenne(table, n);
/* double ecart = longueur(table[i].mot) - longueur_moyenne(table, n);*/
double ecart = longueur(table[i].mot) - moyenne;
somme += ecart * ecart;
}
return somme / n; /* variance ; la racine est prise dans main */
@@ -412,10 +439,12 @@ int main(void)
normaliser_ligne(lignes[i]);
Entree *table = malloc(MAX_MOTS_UNIQUES * sizeof(Entree));
int *index_mots = calloc(TAILLE_HACHAGE, sizeof(int));
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);
trier_entrees(table, nb_entrees);
@@ -445,6 +474,7 @@ int main(void)
printf("\nEmpreinte du rapport : %016lx\n", empreinte(rapport));
free(rapport);
free(index_mots);
free(table);
for (int i = 0; i < nb_lignes; i++)
free(lignes[i]);
BIN
View File
Binary file not shown.
+169
View File
@@ -0,0 +1,169 @@
Flat profile:
Each sample counts as 0.01 seconds.
% cumulative self self total
time seconds seconds calls s/call s/call name
34.51 1.56 1.56 308701874 0.00 0.00 egales
29.20 2.88 1.32 36009819 0.00 0.00 longueur
13.27 3.48 0.60 150182 0.00 0.00 chercher_mot
5.09 3.71 0.23 12172087 0.00 0.00 comparer
4.09 3.90 0.18 1 0.18 0.49 trier_entrees
3.10 4.04 0.14 _init
2.88 4.17 0.13 5867 0.00 0.00 longueur_moyenne
2.21 4.26 0.10 250000 0.00 0.00 est_mot_vide
1.77 4.34 0.08 17202045 0.00 0.00 doit_echanger
1.44 4.41 0.07 21746 0.00 0.00 compter_mots_ligne
1.11 4.46 0.05 32667 0.00 0.00 copier
0.44 4.48 0.02 5297256 0.00 0.00 est_lettre
0.44 4.50 0.02 928117 0.00 0.00 alea
0.22 4.51 0.01 1 0.01 0.01 decouper_lignes
0.22 4.52 0.01 1 0.01 0.03 generer_texte
0.00 4.52 0.00 1266663 0.00 0.00 en_minuscule
0.00 4.52 0.00 150182 0.00 0.00 compter_mot
0.00 4.52 0.00 26801 0.00 0.00 ajouter
0.00 4.52 0.00 21746 0.00 0.00 normaliser_ligne
0.00 4.52 0.00 1 0.00 0.01 analyser_bigrammes
0.00 4.52 0.00 1 0.00 0.01 construire_rapport
0.00 4.52 0.00 1 0.00 1.39 ecart_type_longueur
0.00 4.52 0.00 1 0.00 0.00 empreinte
0.00 4.52 0.00 1 0.00 0.03 generer_vocabulaire
0.00 4.52 0.00 1 0.00 0.00 racine
Call graph
granularity: each sample hit covers 4 byte(s) for 0.22% of 4.52 seconds
index % time self children called name
<spontaneous>
[1] 96.9 0.00 4.38 main [1]
0.07 2.27 21746/21746 compter_mots_ligne [2]
0.00 1.39 1/1 ecart_type_longueur [7]
0.18 0.31 1/1 trier_entrees [9]
0.00 0.06 21746/21746 normaliser_ligne [14]
0.00 0.03 1/1 generer_vocabulaire [17]
0.01 0.02 1/1 generer_texte [18]
0.00 0.01 1/1 analyser_bigrammes [21]
0.01 0.00 1/1 decouper_lignes [22]
0.00 0.01 1/1 construire_rapport [23]
0.00 0.00 1/5867 longueur_moyenne [6]
0.00 0.00 1/1 racine [26]
0.00 0.00 1/1 empreinte [25]
-----------------------------------------------
0.07 2.27 21746/21746 main [1]
[2] 51.6 0.07 2.27 21746 compter_mots_ligne [2]
0.00 2.11 150182/150182 compter_mot [3]
0.10 0.06 250000/250000 est_mot_vide [12]
-----------------------------------------------
0.00 2.11 150182/150182 compter_mots_ligne [2]
[3] 46.6 0.00 2.11 150182 compter_mot [3]
0.60 1.50 150182/150182 chercher_mot [4]
0.01 0.00 5866/32667 copier [15]
-----------------------------------------------
0.60 1.50 150182/150182 compter_mot [3]
[4] 46.4 0.60 1.50 150182 chercher_mot [4]
1.50 0.00 296656203/308701874 egales [5]
-----------------------------------------------
0.06 0.00 12045671/308701874 est_mot_vide [12]
1.50 0.00 296656203/308701874 chercher_mot [4]
[5] 34.5 1.56 0.00 308701874 egales [5]
-----------------------------------------------
0.00 0.00 1/5867 main [1]
0.13 1.26 5866/5867 ecart_type_longueur [7]
[6] 30.8 0.13 1.26 5867 longueur_moyenne [6]
1.26 0.00 34415822/36009819 longueur [8]
-----------------------------------------------
0.00 1.39 1/1 main [1]
[7] 30.8 0.00 1.39 1 ecart_type_longueur [7]
0.13 1.26 5866/5867 longueur_moyenne [6]
0.00 0.00 5866/36009819 longueur [8]
-----------------------------------------------
0.00 0.00 5866/36009819 ecart_type_longueur [7]
0.00 0.00 26801/36009819 ajouter [16]
0.06 0.00 1561330/36009819 normaliser_ligne [14]
1.26 0.00 34415822/36009819 longueur_moyenne [6]
[8] 29.2 1.32 0.00 36009819 longueur [8]
-----------------------------------------------
0.18 0.31 1/1 main [1]
[9] 11.0 0.18 0.31 1 trier_entrees [9]
0.08 0.23 17202045/17202045 doit_echanger [10]
-----------------------------------------------
0.08 0.23 17202045/17202045 trier_entrees [9]
[10] 6.9 0.08 0.23 17202045 doit_echanger [10]
0.23 0.00 12172087/12172087 comparer [11]
-----------------------------------------------
0.23 0.00 12172087/12172087 doit_echanger [10]
[11] 5.1 0.23 0.00 12172087 comparer [11]
-----------------------------------------------
0.10 0.06 250000/250000 compter_mots_ligne [2]
[12] 3.6 0.10 0.06 250000 est_mot_vide [12]
0.06 0.00 12045671/308701874 egales [5]
-----------------------------------------------
<spontaneous>
[13] 3.1 0.14 0.00 _init [13]
-----------------------------------------------
0.00 0.06 21746/21746 main [1]
[14] 1.4 0.00 0.06 21746 normaliser_ligne [14]
0.06 0.00 1561330/36009819 longueur [8]
0.01 0.00 1539584/5297256 est_lettre [19]
0.00 0.00 1266663/1266663 en_minuscule [24]
-----------------------------------------------
0.01 0.00 5866/32667 compter_mot [3]
0.04 0.00 26801/32667 ajouter [16]
[15] 1.1 0.05 0.00 32667 copier [15]
-----------------------------------------------
0.00 0.01 5867/26801 construire_rapport [23]
0.00 0.03 20934/26801 generer_vocabulaire [17]
[16] 0.9 0.00 0.04 26801 ajouter [16]
0.04 0.00 26801/32667 copier [15]
0.00 0.00 26801/36009819 longueur [8]
-----------------------------------------------
0.00 0.03 1/1 main [1]
[17] 0.7 0.00 0.03 1 generer_vocabulaire [17]
0.00 0.03 20934/26801 ajouter [16]
0.00 0.00 27934/928117 alea [20]
-----------------------------------------------
0.01 0.02 1/1 main [1]
[18] 0.7 0.01 0.02 1 generer_texte [18]
0.02 0.00 900183/928117 alea [20]
-----------------------------------------------
0.01 0.00 1539584/5297256 normaliser_ligne [14]
0.01 0.00 3757672/5297256 analyser_bigrammes [21]
[19] 0.4 0.02 0.00 5297256 est_lettre [19]
-----------------------------------------------
0.00 0.00 27934/928117 generer_vocabulaire [17]
0.02 0.00 900183/928117 generer_texte [18]
[20] 0.4 0.02 0.00 928117 alea [20]
-----------------------------------------------
0.00 0.01 1/1 main [1]
[21] 0.3 0.00 0.01 1 analyser_bigrammes [21]
0.01 0.00 3757672/5297256 est_lettre [19]
-----------------------------------------------
0.01 0.00 1/1 main [1]
[22] 0.2 0.01 0.00 1 decouper_lignes [22]
-----------------------------------------------
0.00 0.01 1/1 main [1]
[23] 0.2 0.00 0.01 1 construire_rapport [23]
0.00 0.01 5867/26801 ajouter [16]
-----------------------------------------------
0.00 0.00 1266663/1266663 normaliser_ligne [14]
[24] 0.0 0.00 0.00 1266663 en_minuscule [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
[13] _init [15] copier [18] generer_texte
[16] ajouter [22] decouper_lignes [17] generer_vocabulaire
[20] alea [10] doit_echanger [8] longueur
[21] analyser_bigrammes [7] ecart_type_longueur [6] longueur_moyenne
[4] chercher_mot [5] egales [14] normaliser_ligne
[11] comparer [25] empreinte [26] racine
[3] compter_mot [24] en_minuscule [9] trier_entrees
[2] compter_mots_ligne [19] est_lettre
[23] construire_rapport [12] 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
40.37 1.74 1.74 308701874 0.00 0.00 egales
24.94 2.81 1.07 150182 0.01 0.02 chercher_mot
19.03 3.63 0.82 1605729 0.00 0.00 longueur
4.64 3.83 0.20 12172087 0.00 0.00 comparer
3.25 3.98 0.14 _init
3.02 4.11 0.13 1 130.00 440.00 trier_entrees
2.55 4.21 0.11 17202045 0.00 0.00 doit_echanger
1.28 4.27 0.06 250000 0.00 0.00 est_mot_vide
0.46 4.29 0.02 1 20.00 20.00 generer_texte
0.23 4.30 0.01 1 10.00 10.00 analyser_bigrammes
0.23 4.31 0.01 1 10.00 10.00 decouper_lignes
0.00 4.31 0.00 5297256 0.00 0.00 est_lettre
0.00 4.31 0.00 1266663 0.00 0.00 en_minuscule
0.00 4.31 0.00 928117 0.00 0.00 alea
0.00 4.31 0.00 150182 0.00 0.02 compter_mot
0.00 4.31 0.00 32667 0.00 0.00 copier
0.00 4.31 0.00 26801 0.00 0.00 ajouter
0.00 4.31 0.00 21746 0.00 0.13 compter_mots_ligne
0.00 4.31 0.00 21746 0.00 0.04 normaliser_ligne
0.00 4.31 0.00 2 0.00 3.00 longueur_moyenne
0.00 4.31 0.00 1 0.00 3.00 construire_rapport
0.00 4.31 0.00 1 0.00 5.99 ecart_type_longueur
0.00 4.31 0.00 1 0.00 0.00 empreinte
0.00 4.31 0.00 1 0.00 10.69 generer_vocabulaire
0.00 4.31 0.00 1 0.00 0.00 racine
Call graph
granularity: each sample hit covers 4 byte(s) for 0.23% of 4.31 seconds
index % time self children called name
<spontaneous>
[1] 96.8 0.00 4.17 main [1]
0.00 2.87 21746/21746 compter_mots_ligne [2]
0.00 0.80 21746/21746 normaliser_ligne [7]
0.13 0.31 1/1 trier_entrees [8]
0.02 0.00 1/1 generer_texte [13]
0.00 0.01 1/1 generer_vocabulaire [15]
0.01 0.00 1/1 decouper_lignes [17]
0.01 0.00 1/1 analyser_bigrammes [16]
0.00 0.01 1/1 ecart_type_longueur [19]
0.00 0.00 1/1 construire_rapport [20]
0.00 0.00 1/2 longueur_moyenne [18]
0.00 0.00 1/1 racine [26]
0.00 0.00 1/1 empreinte [25]
-----------------------------------------------
0.00 2.87 21746/21746 main [1]
[2] 66.6 0.00 2.87 21746 compter_mots_ligne [2]
0.00 2.75 150182/150182 compter_mot [4]
0.06 0.07 250000/250000 est_mot_vide [12]
-----------------------------------------------
1.07 1.67 150182/150182 compter_mot [4]
[3] 63.7 1.07 1.67 150182 chercher_mot [3]
1.67 0.00 296656203/308701874 egales [5]
-----------------------------------------------
0.00 2.75 150182/150182 compter_mots_ligne [2]
[4] 63.7 0.00 2.75 150182 compter_mot [4]
1.07 1.67 150182/150182 chercher_mot [3]
0.00 0.00 5866/32667 copier [24]
-----------------------------------------------
0.07 0.00 12045671/308701874 est_mot_vide [12]
1.67 0.00 296656203/308701874 chercher_mot [3]
[5] 40.4 1.74 0.00 308701874 egales [5]
-----------------------------------------------
0.00 0.00 5866/1605729 ecart_type_longueur [19]
0.01 0.00 11732/1605729 longueur_moyenne [18]
0.01 0.00 26801/1605729 ajouter [14]
0.80 0.00 1561330/1605729 normaliser_ligne [7]
[6] 19.0 0.82 0.00 1605729 longueur [6]
-----------------------------------------------
0.00 0.80 21746/21746 main [1]
[7] 18.5 0.00 0.80 21746 normaliser_ligne [7]
0.80 0.00 1561330/1605729 longueur [6]
0.00 0.00 1539584/5297256 est_lettre [21]
0.00 0.00 1266663/1266663 en_minuscule [22]
-----------------------------------------------
0.13 0.31 1/1 main [1]
[8] 10.2 0.13 0.31 1 trier_entrees [8]
0.11 0.20 17202045/17202045 doit_echanger [9]
-----------------------------------------------
0.11 0.20 17202045/17202045 trier_entrees [8]
[9] 7.2 0.11 0.20 17202045 doit_echanger [9]
0.20 0.00 12172087/12172087 comparer [10]
-----------------------------------------------
0.20 0.00 12172087/12172087 doit_echanger [9]
[10] 4.6 0.20 0.00 12172087 comparer [10]
-----------------------------------------------
<spontaneous>
[11] 3.2 0.14 0.00 _init [11]
-----------------------------------------------
0.06 0.07 250000/250000 compter_mots_ligne [2]
[12] 2.9 0.06 0.07 250000 est_mot_vide [12]
0.07 0.00 12045671/308701874 egales [5]
-----------------------------------------------
0.02 0.00 1/1 main [1]
[13] 0.5 0.02 0.00 1 generer_texte [13]
0.00 0.00 900183/928117 alea [23]
-----------------------------------------------
0.00 0.00 5867/26801 construire_rapport [20]
0.00 0.01 20934/26801 generer_vocabulaire [15]
[14] 0.3 0.00 0.01 26801 ajouter [14]
0.01 0.00 26801/1605729 longueur [6]
0.00 0.00 26801/32667 copier [24]
-----------------------------------------------
0.00 0.01 1/1 main [1]
[15] 0.2 0.00 0.01 1 generer_vocabulaire [15]
0.00 0.01 20934/26801 ajouter [14]
0.00 0.00 27934/928117 alea [23]
-----------------------------------------------
0.01 0.00 1/1 main [1]
[16] 0.2 0.01 0.00 1 analyser_bigrammes [16]
0.00 0.00 3757672/5297256 est_lettre [21]
-----------------------------------------------
0.01 0.00 1/1 main [1]
[17] 0.2 0.01 0.00 1 decouper_lignes [17]
-----------------------------------------------
0.00 0.00 1/2 ecart_type_longueur [19]
0.00 0.00 1/2 main [1]
[18] 0.1 0.00 0.01 2 longueur_moyenne [18]
0.01 0.00 11732/1605729 longueur [6]
-----------------------------------------------
0.00 0.01 1/1 main [1]
[19] 0.1 0.00 0.01 1 ecart_type_longueur [19]
0.00 0.00 5866/1605729 longueur [6]
0.00 0.00 1/2 longueur_moyenne [18]
-----------------------------------------------
0.00 0.00 1/1 main [1]
[20] 0.1 0.00 0.00 1 construire_rapport [20]
0.00 0.00 5867/26801 ajouter [14]
-----------------------------------------------
0.00 0.00 1539584/5297256 normaliser_ligne [7]
0.00 0.00 3757672/5297256 analyser_bigrammes [16]
[21] 0.0 0.00 0.00 5297256 est_lettre [21]
-----------------------------------------------
0.00 0.00 1266663/1266663 normaliser_ligne [7]
[22] 0.0 0.00 0.00 1266663 en_minuscule [22]
-----------------------------------------------
0.00 0.00 27934/928117 generer_vocabulaire [15]
0.00 0.00 900183/928117 generer_texte [13]
[23] 0.0 0.00 0.00 928117 alea [23]
-----------------------------------------------
0.00 0.00 5866/32667 compter_mot [4]
0.00 0.00 26801/32667 ajouter [14]
[24] 0.0 0.00 0.00 32667 copier [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
[11] _init [24] copier [13] generer_texte
[14] ajouter [17] decouper_lignes [15] generer_vocabulaire
[23] alea [9] doit_echanger [6] longueur
[16] analyser_bigrammes [19] ecart_type_longueur [18] longueur_moyenne
[3] chercher_mot [5] egales [7] normaliser_ligne
[10] comparer [25] empreinte [26] racine
[4] compter_mot [22] en_minuscule [8] trier_entrees
[2] compter_mots_ligne [21] est_lettre
[20] construire_rapport [12] est_mot_vide
+174
View File
@@ -0,0 +1,174 @@
Flat profile:
Each sample counts as 0.01 seconds.
% cumulative self self total
time seconds seconds calls ms/call ms/call name
52.03 0.77 0.77 1605729 0.00 0.00 longueur
11.15 0.94 0.17 12172087 0.00 0.00 comparer
10.47 1.09 0.15 1 155.00 470.00 trier_entrees
10.14 1.24 0.15 17202045 0.00 0.00 doit_echanger
4.05 1.30 0.06 250000 0.00 0.00 est_mot_vide
3.72 1.35 0.06 12194837 0.00 0.00 egales
1.35 1.38 0.02 150182 0.00 0.00 chercher_mot
1.35 1.40 0.02 150182 0.00 0.00 hacher_mot
1.35 1.42 0.02 1 20.00 20.00 analyser_bigrammes
1.35 1.44 0.02 1 20.00 20.00 generer_texte
1.01 1.45 0.01 21746 0.00 0.01 compter_mots_ligne
0.68 1.46 0.01 1 10.00 12.81 construire_rapport
0.68 1.47 0.01 1 10.00 10.00 decouper_lignes
0.68 1.48 0.01 _init
0.00 1.48 0.00 5297256 0.00 0.00 est_lettre
0.00 1.48 0.00 1266663 0.00 0.00 en_minuscule
0.00 1.48 0.00 928117 0.00 0.00 alea
0.00 1.48 0.00 150182 0.00 0.00 compter_mot
0.00 1.48 0.00 32667 0.00 0.00 copier
0.00 1.48 0.00 26801 0.00 0.00 ajouter
0.00 1.48 0.00 21746 0.00 0.03 normaliser_ligne
0.00 1.48 0.00 2 0.00 2.81 longueur_moyenne
0.00 1.48 0.00 1 0.00 5.63 ecart_type_longueur
0.00 1.48 0.00 1 0.00 0.00 empreinte
0.00 1.48 0.00 1 0.00 10.04 generer_vocabulaire
0.00 1.48 0.00 1 0.00 0.00 racine
Call graph
granularity: each sample hit covers 4 byte(s) for 0.68% of 1.48 seconds
index % time self children called name
<spontaneous>
[1] 99.3 0.00 1.47 main [1]
0.00 0.75 21746/21746 normaliser_ligne [3]
0.15 0.32 1/1 trier_entrees [4]
0.01 0.15 21746/21746 compter_mots_ligne [6]
0.02 0.00 1/1 generer_texte [14]
0.02 0.00 1/1 analyser_bigrammes [13]
0.01 0.00 1/1 construire_rapport [16]
0.00 0.01 1/1 generer_vocabulaire [17]
0.01 0.00 1/1 decouper_lignes [18]
0.00 0.01 1/1 ecart_type_longueur [21]
0.00 0.00 1/2 longueur_moyenne [20]
0.00 0.00 1/1 racine [27]
0.00 0.00 1/1 empreinte [26]
-----------------------------------------------
0.00 0.00 5866/1605729 ecart_type_longueur [21]
0.01 0.00 11732/1605729 longueur_moyenne [20]
0.01 0.00 26801/1605729 ajouter [15]
0.75 0.00 1561330/1605729 normaliser_ligne [3]
[2] 52.0 0.77 0.00 1605729 longueur [2]
-----------------------------------------------
0.00 0.75 21746/21746 main [1]
[3] 50.6 0.00 0.75 21746 normaliser_ligne [3]
0.75 0.00 1561330/1605729 longueur [2]
0.00 0.00 1539584/5297256 est_lettre [22]
0.00 0.00 1266663/1266663 en_minuscule [23]
-----------------------------------------------
0.15 0.32 1/1 main [1]
[4] 31.8 0.15 0.32 1 trier_entrees [4]
0.15 0.17 17202045/17202045 doit_echanger [5]
-----------------------------------------------
0.15 0.17 17202045/17202045 trier_entrees [4]
[5] 21.3 0.15 0.17 17202045 doit_echanger [5]
0.17 0.00 12172087/12172087 comparer [7]
-----------------------------------------------
0.01 0.15 21746/21746 main [1]
[6] 11.5 0.01 0.15 21746 compter_mots_ligne [6]
0.06 0.05 250000/250000 est_mot_vide [8]
0.00 0.04 150182/150182 compter_mot [11]
-----------------------------------------------
0.17 0.00 12172087/12172087 doit_echanger [5]
[7] 11.1 0.17 0.00 12172087 comparer [7]
-----------------------------------------------
0.06 0.05 250000/250000 compter_mots_ligne [6]
[8] 7.7 0.06 0.05 250000 est_mot_vide [8]
0.05 0.00 12045671/12194837 egales [9]
-----------------------------------------------
0.00 0.00 149166/12194837 chercher_mot [10]
0.05 0.00 12045671/12194837 est_mot_vide [8]
[9] 3.7 0.06 0.00 12194837 egales [9]
-----------------------------------------------
0.02 0.02 150182/150182 compter_mot [11]
[10] 2.7 0.02 0.02 150182 chercher_mot [10]
0.02 0.00 150182/150182 hacher_mot [12]
0.00 0.00 149166/12194837 egales [9]
-----------------------------------------------
0.00 0.04 150182/150182 compter_mots_ligne [6]
[11] 2.7 0.00 0.04 150182 compter_mot [11]
0.02 0.02 150182/150182 chercher_mot [10]
0.00 0.00 5866/32667 copier [25]
-----------------------------------------------
0.02 0.00 150182/150182 chercher_mot [10]
[12] 1.4 0.02 0.00 150182 hacher_mot [12]
-----------------------------------------------
0.02 0.00 1/1 main [1]
[13] 1.4 0.02 0.00 1 analyser_bigrammes [13]
0.00 0.00 3757672/5297256 est_lettre [22]
-----------------------------------------------
0.02 0.00 1/1 main [1]
[14] 1.4 0.02 0.00 1 generer_texte [14]
0.00 0.00 900183/928117 alea [24]
-----------------------------------------------
0.00 0.00 5867/26801 construire_rapport [16]
0.00 0.01 20934/26801 generer_vocabulaire [17]
[15] 0.9 0.00 0.01 26801 ajouter [15]
0.01 0.00 26801/1605729 longueur [2]
0.00 0.00 26801/32667 copier [25]
-----------------------------------------------
0.01 0.00 1/1 main [1]
[16] 0.9 0.01 0.00 1 construire_rapport [16]
0.00 0.00 5867/26801 ajouter [15]
-----------------------------------------------
0.00 0.01 1/1 main [1]
[17] 0.7 0.00 0.01 1 generer_vocabulaire [17]
0.00 0.01 20934/26801 ajouter [15]
0.00 0.00 27934/928117 alea [24]
-----------------------------------------------
0.01 0.00 1/1 main [1]
[18] 0.7 0.01 0.00 1 decouper_lignes [18]
-----------------------------------------------
<spontaneous>
[19] 0.7 0.01 0.00 _init [19]
-----------------------------------------------
0.00 0.00 1/2 ecart_type_longueur [21]
0.00 0.00 1/2 main [1]
[20] 0.4 0.00 0.01 2 longueur_moyenne [20]
0.01 0.00 11732/1605729 longueur [2]
-----------------------------------------------
0.00 0.01 1/1 main [1]
[21] 0.4 0.00 0.01 1 ecart_type_longueur [21]
0.00 0.00 5866/1605729 longueur [2]
0.00 0.00 1/2 longueur_moyenne [20]
-----------------------------------------------
0.00 0.00 1539584/5297256 normaliser_ligne [3]
0.00 0.00 3757672/5297256 analyser_bigrammes [13]
[22] 0.0 0.00 0.00 5297256 est_lettre [22]
-----------------------------------------------
0.00 0.00 1266663/1266663 normaliser_ligne [3]
[23] 0.0 0.00 0.00 1266663 en_minuscule [23]
-----------------------------------------------
0.00 0.00 27934/928117 generer_vocabulaire [17]
0.00 0.00 900183/928117 generer_texte [14]
[24] 0.0 0.00 0.00 928117 alea [24]
-----------------------------------------------
0.00 0.00 5866/32667 compter_mot [11]
0.00 0.00 26801/32667 ajouter [15]
[25] 0.0 0.00 0.00 32667 copier [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 racine [27]
-----------------------------------------------
Index by function name
[19] _init [25] copier [14] generer_texte
[15] ajouter [18] decouper_lignes [17] generer_vocabulaire
[24] alea [5] doit_echanger [12] hacher_mot
[13] analyser_bigrammes [21] ecart_type_longueur [2] longueur
[10] chercher_mot [9] egales [20] longueur_moyenne
[7] comparer [26] empreinte [3] normaliser_ligne
[11] compter_mot [23] en_minuscule [27] racine
[6] compter_mots_ligne [22] est_lettre [4] trier_entrees
[16] construire_rapport [8] est_mot_vide
+71
View File
@@ -0,0 +1,71 @@
Via copilot avec chatGPT-6 Luna
comment je pourrais utiliser longueur une seul fois dans longueur_moyenne ?
11:41 AM
Je regarde la fonction longueur_moyenne et son contexte dans analyseur.c pour voir comment réutiliser le résultat de longueur sans recalcul.
Dans longueur_moyenne, longueur est déjà appelée une seule fois par mot :
for (int i = 0; i < n; i++)
total += longueur(table[i].mot);
Le recalcul coûteux se trouve plutôt dans ecart_type_longueur : la moyenne est recalculée à chaque tour de boucle. Calcule-la une seule fois avant la boucle :
double ecart_type_longueur(const Entree *table, int n)
{
double moyenne = longueur_moyenne(table, n);
double somme = 0.0;
for (int i = 0; i < n; i++) {
double ecart = longueur(table[i].mot) - moyenne;
somme += ecart * ecart;
}
return somme / n;
}
Ainsi, longueur_moyenne n’est exécutée qu’une fois pour calculer l’écart-type, au lieu de n fois.
écrit le dans le ficheir
11:42 AM
Je vais modifier ecart_type_longueur dans analyseur.c pour calculer la moyenne avant la boucle, puis compiler le fichier pour vérifier la correction.
comment on pourrait réduire les utilisation de chercher_mot ?
11:52 AM
Dans ton code, chercher_mot est appelée une fois pour chaque mot non vide par compter_mot. On ne peut pas vraiment éviter cette recherche à chaque occurrence : il faut savoir si le mot est déjà dans la table pour incrémenter son compteur ou l’ajouter.
Le vrai gain serait de remplacer la recherche linéaire dans chercher_mot par une table de hachage. Aujourd’hui, la fonction peut comparer le mot à beaucoup d’entrées (O(nb_entrees) par recherche). Avec une table de hachage, on calcule une position à partir du mot et on retrouve généralement l’entrée en temps quasi constant. Le nombre d’appels peut rester identique, mais chaque appel coûte beaucoup moins cher.
On peut conserver table pour le tri et le rapport, et ajouter une table de hachage qui associe chaque mot à son indice dans table. Pour une première étape plus simple, tu peux aussi garder la recherche linéaire : elle est plus facile à comprendre, mais le gain sera surtout visible quand le nombre de mots distincts devient grand.
11:53 AM
11s
•
GPT-6 Luna • 0.4 credits
fait le
11:53 AM
Je vais remplacer la recherche linéaire par un index de hachage tout en gardant table intacte pour le tri et le rapport. Je vérifie d’abord le code réellement présent, puis je compilerai et comparerai l’empreinte produite.
Le point coûteux est confirmé : chercher_mot parcourt toutes les entrées déjà comptées à chaque mot. J’ajoute un tableau de hachage à adressage ouvert (case vide = 0, sinon indice + 1), ce qui conserve le tableau de mots utilisé ensuite par le tri, tout en accélérant les recherches.
L’index est maintenant intégré : les collisions sont gérées par sondage, et les indices restent cohérents avec le tableau avant le tri. La compilation en terminal a été annulée ; je vérifie donc les diagnostics disponibles dans l’éditeur sans relancer cette commande.
J’ai remplacé la recherche linéaire de chercher_mot par un index de hachage dans analyseur.c. Le tableau des entrées reste inchangé pour le tri et le rapport ; la recherche gère les collisions par sondage.
L’éditeur ne signale aucune erreur. La compilation en terminal ayant été annulée, je n’ai pas vérifié l’exécution ni l’empreinte du rapport.
Via copilot avec chatGPT-6 Luna
+5867
View File
File diff suppressed because it is too large Load Diff