diff --git a/banque_pg b/banque_pg index ec53781..f7d0032 100644 Binary files a/banque_pg and b/banque_pg differ diff --git a/compte_rendu.md b/compte_rendu.md index 9a7935d..87da0f4 100644 --- a/compte_rendu.md +++ b/compte_rendu.md @@ -5,7 +5,7 @@ | Fonction | Rôle | Avant | Après | |---|---|---|---| | F1 | `trier_par_montant` — tri par montant puis par id | O(n²) | **O(n log n)** (tri fusion) | -| F2 | `nb_clients_distincts` | O(n²) | | +| F2 | `nb_clients_distincts` | O(n²) | **O(n + c)** (tableau de présence) | | F3 | `total_par_client` | O(n·c) | | | F4 | `total_par_jour` | O(n·J) | | | F5 | `meilleure_periode` | O(J³) | | @@ -43,3 +43,26 @@ L'ordre de tri est conservé (montant croissant, puis id croissant en cas d'éga | Temps total du programme | 6,83 s | 3,06 s | Le tri passe de 48 % du temps à un coût négligeable ; le temps total est divisé par plus de 2. Les fonctions les plus coûteuses sont maintenant `nb_facons_rendre` (30 %), `nb_paires_opposees` (24 %) et `rechercher_par_id` (22 %). + +### 3.2 F2 — `nb_clients_distincts` : double boucle → tableau de présence + +**Avant :** pour chaque transaction, on reparcourt toutes les transactions précédentes pour savoir si le client a déjà été vu → O(n²). + +**Après :** l'id du client sert directement d'index dans un tableau de booléens `presence` : +1. un premier parcours trouve l'id client maximal pour dimensionner le tableau ; +2. le tableau est alloué avec `calloc` (initialisé à `false`) ; +3. un second parcours marque chaque client rencontré et incrémente le compteur la première fois qu'il est vu ; +4. le tableau est libéré avec `free`. + +Chaque vérification « déjà vu ? » se fait en O(1), d'où une complexité O(n + c) (c = nombre de clients). Le résultat est identique, l'empreinte est inchangée. + +**Profil gprof après modification :** + +![Profil gprof après optimisation de F2](gprof/3_modif_nb_clients_distincts.png) + +| | Avant | Après | +|---|---|---| +| Temps de `nb_clients_distincts` | 0,11 s | 0,00 s | +| Temps total du programme | 3,06 s | 3,07 s | + +La fonction devient négligeable dans le profil. Le gain sur le temps total n'est pas visible car il est inférieur aux variations de mesure de gprof (échantillonnage à 0,01 s). Les fonctions les plus coûteuses restent `nb_facons_rendre` (28 %), `nb_paires_opposees` (26 %) et `rechercher_par_id` (25 %). diff --git a/gmon.out b/gmon.out index a75709b..2f9f361 100644 Binary files a/gmon.out and b/gmon.out differ diff --git a/gprof/3_modif_nb_clients_distincts.png b/gprof/3_modif_nb_clients_distincts.png new file mode 100644 index 0000000..84b9ea7 Binary files /dev/null and b/gprof/3_modif_nb_clients_distincts.png differ diff --git a/profil_avant.txt b/profil_avant.txt index 62edb4b..d711718 100644 --- a/profil_avant.txt +++ b/profil_avant.txt @@ -3,98 +3,98 @@ Flat profile: Each sample counts as 0.01 seconds. % cumulative self self total time seconds seconds calls ms/call ms/call name - 30.39 0.93 0.93 1 930.00 930.00 nb_facons_rendre - 23.86 1.66 0.73 1 730.00 730.00 nb_paires_opposees - 21.57 2.32 0.66 30000 0.02 0.02 rechercher_par_id - 8.50 2.58 0.26 6017 0.04 0.04 longueur - 7.52 2.81 0.23 1 230.00 230.00 meilleure_periode - 3.59 2.92 0.11 1 110.00 110.00 nb_clients_distincts + 28.50 0.88 0.88 1 875.00 875.00 nb_facons_rendre + 26.38 1.69 0.81 1 810.00 810.00 nb_paires_opposees + 24.76 2.44 0.76 30000 0.03 0.03 rechercher_par_id + 7.82 2.69 0.24 6017 0.04 0.04 longueur + 7.82 2.92 0.24 1 240.00 240.00 meilleure_periode 2.61 3.00 0.08 1 80.00 80.00 total_par_client - 1.31 3.04 0.04 1 40.00 40.00 total_par_jour - 0.33 3.05 0.01 30000 0.00 0.00 categorie - 0.33 3.06 0.01 29999 0.00 0.00 fusionner - 0.00 3.06 0.00 149998 0.00 0.00 alea - 0.00 3.06 0.00 6017 0.00 0.04 ajouter_ligne - 0.00 3.06 0.00 1 0.00 0.00 empreinte - 0.00 3.06 0.00 1 0.00 0.00 generer_transactions - 0.00 3.06 0.00 1 0.00 10.00 trier_par_montant + 1.30 3.04 0.04 1 40.00 40.00 total_par_jour + 0.49 3.06 0.01 30000 0.00 0.00 categorie + 0.33 3.07 0.01 29999 0.00 0.00 fusionner + 0.00 3.07 0.00 149998 0.00 0.00 alea + 0.00 3.07 0.00 6017 0.00 0.04 ajouter_ligne + 0.00 3.07 0.00 1 0.00 0.00 empreinte + 0.00 3.07 0.00 1 0.00 0.00 generer_transactions + 0.00 3.07 0.00 1 0.00 0.00 nb_clients_distincts + 0.00 3.07 0.00 1 0.00 10.00 trier_par_montant Call graph -granularity: each sample hit covers 4 byte(s) for 0.33% of 3.06 seconds +granularity: each sample hit covers 4 byte(s) for 0.33% of 3.07 seconds index % time self children called name -[1] 100.0 0.00 3.06 main [1] - 0.93 0.00 1/1 nb_facons_rendre [2] - 0.73 0.00 1/1 nb_paires_opposees [3] - 0.66 0.00 30000/30000 rechercher_par_id [4] - 0.00 0.26 6017/6017 ajouter_ligne [5] - 0.23 0.00 1/1 meilleure_periode [7] - 0.11 0.00 1/1 nb_clients_distincts [8] - 0.08 0.00 1/1 total_par_client [9] - 0.04 0.00 1/1 total_par_jour [10] - 0.01 0.00 30000/30000 categorie [11] - 0.00 0.01 1/1 trier_par_montant [13] - 0.00 0.00 1/1 generer_transactions [16] - 0.00 0.00 1/1 empreinte [15] +[1] 100.0 0.00 3.07 main [1] + 0.88 0.00 1/1 nb_facons_rendre [2] + 0.81 0.00 1/1 nb_paires_opposees [3] + 0.76 0.00 30000/30000 rechercher_par_id [4] + 0.00 0.24 6017/6017 ajouter_ligne [5] + 0.24 0.00 1/1 meilleure_periode [7] + 0.08 0.00 1/1 total_par_client [8] + 0.04 0.00 1/1 total_par_jour [9] + 0.01 0.00 30000/30000 categorie [10] + 0.00 0.01 1/1 trier_par_montant [12] + 0.00 0.00 1/1 generer_transactions [15] + 0.00 0.00 1/1 nb_clients_distincts [16] + 0.00 0.00 1/1 empreinte [14] ----------------------------------------------- 266723738 nb_facons_rendre [2] - 0.93 0.00 1/1 main [1] -[2] 30.4 0.93 0.00 1+266723738 nb_facons_rendre [2] + 0.88 0.00 1/1 main [1] +[2] 28.5 0.88 0.00 1+266723738 nb_facons_rendre [2] 266723738 nb_facons_rendre [2] ----------------------------------------------- - 0.73 0.00 1/1 main [1] -[3] 23.9 0.73 0.00 1 nb_paires_opposees [3] + 0.81 0.00 1/1 main [1] +[3] 26.4 0.81 0.00 1 nb_paires_opposees [3] ----------------------------------------------- - 0.66 0.00 30000/30000 main [1] -[4] 21.6 0.66 0.00 30000 rechercher_par_id [4] + 0.76 0.00 30000/30000 main [1] +[4] 24.8 0.76 0.00 30000 rechercher_par_id [4] ----------------------------------------------- - 0.00 0.26 6017/6017 main [1] -[5] 8.5 0.00 0.26 6017 ajouter_ligne [5] - 0.26 0.00 6017/6017 longueur [6] + 0.00 0.24 6017/6017 main [1] +[5] 7.8 0.00 0.24 6017 ajouter_ligne [5] + 0.24 0.00 6017/6017 longueur [6] ----------------------------------------------- - 0.26 0.00 6017/6017 ajouter_ligne [5] -[6] 8.5 0.26 0.00 6017 longueur [6] + 0.24 0.00 6017/6017 ajouter_ligne [5] +[6] 7.8 0.24 0.00 6017 longueur [6] ----------------------------------------------- - 0.23 0.00 1/1 main [1] -[7] 7.5 0.23 0.00 1 meilleure_periode [7] ------------------------------------------------ - 0.11 0.00 1/1 main [1] -[8] 3.6 0.11 0.00 1 nb_clients_distincts [8] + 0.24 0.00 1/1 main [1] +[7] 7.8 0.24 0.00 1 meilleure_periode [7] ----------------------------------------------- 0.08 0.00 1/1 main [1] -[9] 2.6 0.08 0.00 1 total_par_client [9] +[8] 2.6 0.08 0.00 1 total_par_client [8] ----------------------------------------------- 0.04 0.00 1/1 main [1] -[10] 1.3 0.04 0.00 1 total_par_jour [10] +[9] 1.3 0.04 0.00 1 total_par_jour [9] ----------------------------------------------- 0.01 0.00 30000/30000 main [1] -[11] 0.3 0.01 0.00 30000 categorie [11] +[10] 0.5 0.01 0.00 30000 categorie [10] ----------------------------------------------- - 0.01 0.00 29999/29999 trier_par_montant [13] -[12] 0.3 0.01 0.00 29999 fusionner [12] + 0.01 0.00 29999/29999 trier_par_montant [12] +[11] 0.3 0.01 0.00 29999 fusionner [11] ----------------------------------------------- 0.00 0.01 1/1 main [1] -[13] 0.3 0.00 0.01 1 trier_par_montant [13] - 0.01 0.00 29999/29999 fusionner [12] +[12] 0.3 0.00 0.01 1 trier_par_montant [12] + 0.01 0.00 29999/29999 fusionner [11] ----------------------------------------------- - 0.00 0.00 149998/149998 generer_transactions [16] -[14] 0.0 0.00 0.00 149998 alea [14] + 0.00 0.00 149998/149998 generer_transactions [15] +[13] 0.0 0.00 0.00 149998 alea [13] ----------------------------------------------- 0.00 0.00 1/1 main [1] -[15] 0.0 0.00 0.00 1 empreinte [15] +[14] 0.0 0.00 0.00 1 empreinte [14] ----------------------------------------------- 0.00 0.00 1/1 main [1] -[16] 0.0 0.00 0.00 1 generer_transactions [16] - 0.00 0.00 149998/149998 alea [14] +[15] 0.0 0.00 0.00 1 generer_transactions [15] + 0.00 0.00 149998/149998 alea [13] +----------------------------------------------- + 0.00 0.00 1/1 main [1] +[16] 0.0 0.00 0.00 1 nb_clients_distincts [16] ----------------------------------------------- Index by function name - [5] ajouter_ligne [16] generer_transactions [3] nb_paires_opposees - [14] alea [6] longueur [4] rechercher_par_id - [11] categorie [7] meilleure_periode [9] total_par_client - [15] empreinte [8] nb_clients_distincts [10] total_par_jour - [12] fusionner (banque.c) [2] nb_facons_rendre [13] trier_par_montant + [5] ajouter_ligne [15] generer_transactions [3] nb_paires_opposees + [13] alea [6] longueur [4] rechercher_par_id + [10] categorie [7] meilleure_periode [8] total_par_client + [14] empreinte [16] nb_clients_distincts [9] total_par_jour + [11] fusionner (banque.c) [2] nb_facons_rendre [12] trier_par_montant