forked from menault/2026_TD1_DEV51_Qualite_Algo
Optimisé chercher_mot par recherche dichotomique
This commit is contained in:
@@ -0,0 +1,155 @@
|
||||
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
|
||||
```
|
||||
Reference in New Issue
Block a user