Files
TD1_DEV51_Qualite_Algo/TD1.md

111 lines
3.4 KiB
Markdown
Raw Normal View History

2025-09-10 16:30:34 +02:00
# 📊 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 dexécution **suffisamment long pour lanalyse**, 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 dexécutions par fonction
- Temps cumulé au fil des appels
- Nombre dappels 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 dappels
- Une vision hiérarchique (*arbre dexé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 lanalyse
- La fonction **la plus lente est `bubblesort`** (≈80% du temps total).
- Elle est appelée **plus d1 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 quil **ny a plus aucun échange** avant darrê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 dexécution diminue drastiquement.
👉 Le tri devient **beaucoup plus rapide et plus efficace**.
---
## 📌 Résumé
- **Flat Profile** → temps et nb dexécutions par fonction (ici `bubblesort ≈ 80%`).
- **Call Graph** → arbre dappels 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.*