forked from menault/TD1_DEV51_Qualite_Algo
TD1.md
This commit is contained in:
110
TD1.md
Normal file
110
TD1.md
Normal file
@@ -0,0 +1,110 @@
|
|||||||
|
# 📊 TD1 – Analyse de performance et optimisation en C
|
||||||
|
|
||||||
|
## 🚀 Étapes initiales
|
||||||
|
|
||||||
|
Nous avons commencé par récupérer les programmes depuis le dépôt Git de **Maxime Menault**, puis nous les avons compilés et exécutés avec différentes valeurs.
|
||||||
|
Pour obtenir un temps d’exécution **suffisamment long pour l’analyse**, nous avons choisi `1000` et `1000` comme valeurs de test.
|
||||||
|
|
||||||
|
```bash
|
||||||
|
gcc -g -pg -o student_rank student_rank.c heapsort.c bubblesort.c
|
||||||
|
./student_rank 5000 1000 0
|
||||||
|
```
|
||||||
|
|
||||||
|
Ensuite, nous avons utilisé **gprof** pour analyser le programme :
|
||||||
|
|
||||||
|
```bash
|
||||||
|
gprof ./student_rank
|
||||||
|
```
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## 📈 Analyse avec gprof
|
||||||
|
|
||||||
|
### 🔹 Flat Profile
|
||||||
|
Le *Flat Profile* donne un aperçu global :
|
||||||
|
- Temps et nombre d’exécutions par fonction
|
||||||
|
- Temps cumulé au fil des appels
|
||||||
|
- Nombre d’appels effectués
|
||||||
|
- Temps moyen par appel (ms)
|
||||||
|
- Nom de la fonction
|
||||||
|
|
||||||
|
👉 Exemple (extrait) :
|
||||||
|
```
|
||||||
|
Each sample counts as 0.01 seconds.
|
||||||
|
% cumulative self self total
|
||||||
|
time seconds seconds calls s/call s/call name
|
||||||
|
79.80 2.35 2.35 1001000 0.00 0.00 bubblesort
|
||||||
|
19.35 2.92 0.57 1000000 0.00 0.00 find_rank_student
|
||||||
|
```
|
||||||
|
|
||||||
|
### 🔹 Call Graph
|
||||||
|
Le *Call Graph* montre :
|
||||||
|
- Les relations entre les fonctions
|
||||||
|
- Le temps consommé par chaque fonction et ses enfants
|
||||||
|
- Le nombre total d’appels
|
||||||
|
- Une vision hiérarchique (*arbre d’exécution*)
|
||||||
|
|
||||||
|
👉 Exemple (extrait) :
|
||||||
|
```
|
||||||
|
[1] 100.0 0.00 2.96 main [1]
|
||||||
|
0.01 2.92 1/1 sort_students [2]
|
||||||
|
-----------------------------------------------
|
||||||
|
[2] 99.3 0.01 2.92 1 sort_students [2]
|
||||||
|
0.57 2.35 1000000/1000000 find_rank_student [3]
|
||||||
|
-----------------------------------------------
|
||||||
|
[3] 98.9 0.57 2.35 1000000 find_rank_student [3]
|
||||||
|
2.35 0.00 1000000/1001000 bubblesort [4]
|
||||||
|
```
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## 🔎 Résultats de l’analyse
|
||||||
|
|
||||||
|
- La fonction **la plus lente est `bubblesort`** (≈80% du temps total).
|
||||||
|
- Elle est appelée **plus d’1 million de fois** par `find_rank_student`.
|
||||||
|
- Le tri est donc **la source principale de ralentissement**.
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## 🛠️ Optimisations
|
||||||
|
|
||||||
|
### ✅ Correction du bug dans `bubblesort`
|
||||||
|
Le code initial validait sa condition en permanence.
|
||||||
|
Solution : vérifier qu’il **n’y a plus aucun échange** avant d’arrêter la boucle.
|
||||||
|
|
||||||
|
```c
|
||||||
|
void bubblesort(int* array, int length)
|
||||||
|
{
|
||||||
|
int swapped, i, tmp;
|
||||||
|
do {
|
||||||
|
swapped = 0;
|
||||||
|
for(i = 1; i < length; i++) {
|
||||||
|
if(array[i-1] > array[i]) {
|
||||||
|
tmp = array[i-1];
|
||||||
|
array[i-1] = array[i];
|
||||||
|
array[i] = tmp;
|
||||||
|
swapped++;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
} while(swapped > 0);
|
||||||
|
}
|
||||||
|
```
|
||||||
|
|
||||||
|
### 🚀 Remplacement de `bubblesort` par `heapsort`
|
||||||
|
En remplaçant **bubblesort** par **heapsort**, le temps d’exécution diminue drastiquement.
|
||||||
|
👉 Le tri devient **beaucoup plus rapide et plus efficace**.
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## 📌 Résumé
|
||||||
|
|
||||||
|
- **Flat Profile** → temps et nb d’exécutions par fonction (ici `bubblesort ≈ 80%`).
|
||||||
|
- **Call Graph** → arbre d’appels entre fonctions + temps consommé.
|
||||||
|
- **Optimisation principale** :
|
||||||
|
- Corriger la condition de `bubblesort`.
|
||||||
|
- Remplacer `bubblesort` par `heapsort` pour de meilleures performances.
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
✍️ *Travail effectué dans le cadre du TD1 – Analyse de performance et optimisation en C.*
|
||||||
|
|
Reference in New Issue
Block a user