forked from menault/2026_TD1_DEV51_Qualite_Algo
TD01 avec FRAMERY Karl
This commit is contained in:
@@ -0,0 +1,127 @@
|
||||
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 un seul appel. 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 avec l'aide de copilot avec chatGPT-6 Luna, en lui précisant que nous cherchions a amélioré les parties de longueur et chercher_mot. L'historique du chat avec l'IA est disponible dans le fichier "prompt_IA.txt".
|
||||
|
||||
|
||||
|
||||
|
||||
6. Valider
|
||||
|
||||
|
||||
|
||||
Avant d'avoir fait les modifications nous avions obtenu un temps de 9 seconde (environ) avec l'emprunte du rapport : 1d53de903efd2b7c
|
||||
|
||||
|
||||
Après modification du script nous avons obtenu un temps de 2.171 secondes avec l'emprunte de rapport : 1d53de903efd2b7c
|
||||
|
||||
|
||||
Nous obtenons une différence de plus de 7 secondes avec ses amélioration.
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
Profile-1 contient la version du code sans changement, le profile-2 contient la version après changement pour la fonction longueur (8.450 secondes). Le profile-3 contient la version final des modification apporté.
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
+42
-12
@@ -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]);
|
||||
|
||||
+169
@@ -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
@@ -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
@@ -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
|
||||
@@ -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
File diff suppressed because it is too large
Load Diff
Reference in New Issue
Block a user