# 📊 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.*