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 |
|---|---|---|---|
| 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 %).
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.
% 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
<spontaneous>
[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