modif compte_rendu.md

This commit is contained in:
2026-10-21 12:41:22 +02:00
parent 7cd7f33955
commit 4b7bdc05a2
5 changed files with 85 additions and 62 deletions
BIN
View File
Binary file not shown.
+24 -1
View File
@@ -5,7 +5,7 @@
| Fonction | Rôle | Avant | Après | | Fonction | Rôle | Avant | Après |
|---|---|---|---| |---|---|---|---|
| F1 | `trier_par_montant` — tri par montant puis par id | O(n²) | **O(n log n)** (tri fusion) | | 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) | | | F3 | `total_par_client` | O(n·c) | |
| F4 | `total_par_jour` | O(n·J) | | | F4 | `total_par_jour` | O(n·J) | |
| F5 | `meilleure_periode` | O(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 | | 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 %). 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 %).
BIN
View File
Binary file not shown.
Binary file not shown.

After

Width:  |  Height:  |  Size: 66 KiB

+61 -61
View File
@@ -3,98 +3,98 @@ Flat profile:
Each sample counts as 0.01 seconds. Each sample counts as 0.01 seconds.
% cumulative self self total % cumulative self self total
time seconds seconds calls ms/call ms/call name time seconds seconds calls ms/call ms/call name
30.39 0.93 0.93 1 930.00 930.00 nb_facons_rendre 28.50 0.88 0.88 1 875.00 875.00 nb_facons_rendre
23.86 1.66 0.73 1 730.00 730.00 nb_paires_opposees 26.38 1.69 0.81 1 810.00 810.00 nb_paires_opposees
21.57 2.32 0.66 30000 0.02 0.02 rechercher_par_id 24.76 2.44 0.76 30000 0.03 0.03 rechercher_par_id
8.50 2.58 0.26 6017 0.04 0.04 longueur 7.82 2.69 0.24 6017 0.04 0.04 longueur
7.52 2.81 0.23 1 230.00 230.00 meilleure_periode 7.82 2.92 0.24 1 240.00 240.00 meilleure_periode
3.59 2.92 0.11 1 110.00 110.00 nb_clients_distincts
2.61 3.00 0.08 1 80.00 80.00 total_par_client 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 1.30 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.49 3.06 0.01 30000 0.00 0.00 categorie
0.33 3.06 0.01 29999 0.00 0.00 fusionner 0.33 3.07 0.01 29999 0.00 0.00 fusionner
0.00 3.06 0.00 149998 0.00 0.00 alea 0.00 3.07 0.00 149998 0.00 0.00 alea
0.00 3.06 0.00 6017 0.00 0.04 ajouter_ligne 0.00 3.07 0.00 6017 0.00 0.04 ajouter_ligne
0.00 3.06 0.00 1 0.00 0.00 empreinte 0.00 3.07 0.00 1 0.00 0.00 empreinte
0.00 3.06 0.00 1 0.00 0.00 generer_transactions 0.00 3.07 0.00 1 0.00 0.00 generer_transactions
0.00 3.06 0.00 1 0.00 10.00 trier_par_montant 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 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 index % time self children called name
<spontaneous> <spontaneous>
[1] 100.0 0.00 3.06 main [1] [1] 100.0 0.00 3.07 main [1]
0.93 0.00 1/1 nb_facons_rendre [2] 0.88 0.00 1/1 nb_facons_rendre [2]
0.73 0.00 1/1 nb_paires_opposees [3] 0.81 0.00 1/1 nb_paires_opposees [3]
0.66 0.00 30000/30000 rechercher_par_id [4] 0.76 0.00 30000/30000 rechercher_par_id [4]
0.00 0.26 6017/6017 ajouter_ligne [5] 0.00 0.24 6017/6017 ajouter_ligne [5]
0.23 0.00 1/1 meilleure_periode [7] 0.24 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 [8]
0.08 0.00 1/1 total_par_client [9] 0.04 0.00 1/1 total_par_jour [9]
0.04 0.00 1/1 total_par_jour [10] 0.01 0.00 30000/30000 categorie [10]
0.01 0.00 30000/30000 categorie [11] 0.00 0.01 1/1 trier_par_montant [12]
0.00 0.01 1/1 trier_par_montant [13] 0.00 0.00 1/1 generer_transactions [15]
0.00 0.00 1/1 generer_transactions [16] 0.00 0.00 1/1 nb_clients_distincts [16]
0.00 0.00 1/1 empreinte [15] 0.00 0.00 1/1 empreinte [14]
----------------------------------------------- -----------------------------------------------
266723738 nb_facons_rendre [2] 266723738 nb_facons_rendre [2]
0.93 0.00 1/1 main [1] 0.88 0.00 1/1 main [1]
[2] 30.4 0.93 0.00 1+266723738 nb_facons_rendre [2] [2] 28.5 0.88 0.00 1+266723738 nb_facons_rendre [2]
266723738 nb_facons_rendre [2] 266723738 nb_facons_rendre [2]
----------------------------------------------- -----------------------------------------------
0.73 0.00 1/1 main [1] 0.81 0.00 1/1 main [1]
[3] 23.9 0.73 0.00 1 nb_paires_opposees [3] [3] 26.4 0.81 0.00 1 nb_paires_opposees [3]
----------------------------------------------- -----------------------------------------------
0.66 0.00 30000/30000 main [1] 0.76 0.00 30000/30000 main [1]
[4] 21.6 0.66 0.00 30000 rechercher_par_id [4] [4] 24.8 0.76 0.00 30000 rechercher_par_id [4]
----------------------------------------------- -----------------------------------------------
0.00 0.26 6017/6017 main [1] 0.00 0.24 6017/6017 main [1]
[5] 8.5 0.00 0.26 6017 ajouter_ligne [5] [5] 7.8 0.00 0.24 6017 ajouter_ligne [5]
0.26 0.00 6017/6017 longueur [6] 0.24 0.00 6017/6017 longueur [6]
----------------------------------------------- -----------------------------------------------
0.26 0.00 6017/6017 ajouter_ligne [5] 0.24 0.00 6017/6017 ajouter_ligne [5]
[6] 8.5 0.26 0.00 6017 longueur [6] [6] 7.8 0.24 0.00 6017 longueur [6]
----------------------------------------------- -----------------------------------------------
0.23 0.00 1/1 main [1] 0.24 0.00 1/1 main [1]
[7] 7.5 0.23 0.00 1 meilleure_periode [7] [7] 7.8 0.24 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.08 0.00 1/1 main [1] 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] 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] 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] 0.01 0.00 29999/29999 trier_par_montant [12]
[12] 0.3 0.01 0.00 29999 fusionner [12] [11] 0.3 0.01 0.00 29999 fusionner [11]
----------------------------------------------- -----------------------------------------------
0.00 0.01 1/1 main [1] 0.00 0.01 1/1 main [1]
[13] 0.3 0.00 0.01 1 trier_par_montant [13] [12] 0.3 0.00 0.01 1 trier_par_montant [12]
0.01 0.00 29999/29999 fusionner [12] 0.01 0.00 29999/29999 fusionner [11]
----------------------------------------------- -----------------------------------------------
0.00 0.00 149998/149998 generer_transactions [16] 0.00 0.00 149998/149998 generer_transactions [15]
[14] 0.0 0.00 0.00 149998 alea [14] [13] 0.0 0.00 0.00 149998 alea [13]
----------------------------------------------- -----------------------------------------------
0.00 0.00 1/1 main [1] 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] 0.00 0.00 1/1 main [1]
[16] 0.0 0.00 0.00 1 generer_transactions [16] [15] 0.0 0.00 0.00 1 generer_transactions [15]
0.00 0.00 149998/149998 alea [14] 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 Index by function name
[5] ajouter_ligne [16] generer_transactions [3] nb_paires_opposees [5] ajouter_ligne [15] generer_transactions [3] nb_paires_opposees
[14] alea [6] longueur [4] rechercher_par_id [13] alea [6] longueur [4] rechercher_par_id
[11] categorie [7] meilleure_periode [9] total_par_client [10] categorie [7] meilleure_periode [8] total_par_client
[15] empreinte [8] nb_clients_distincts [10] total_par_jour [14] empreinte [16] nb_clients_distincts [9] total_par_jour
[12] fusionner (banque.c) [2] nb_facons_rendre [13] trier_par_montant [11] fusionner (banque.c) [2] nb_facons_rendre [12] trier_par_montant