forked from menault/2026_TD3_DEV51_Qualite_Algo
Optimiser F10 en conservant la fin du rapport
This commit is contained in:
+136
-2
@@ -163,7 +163,7 @@ Le tableau reprend l'analyse initiale de `notes.md`, avec la complexité
|
|||||||
cyclomatique de chaque fonction. Les complexités temporelles sont données
|
cyclomatique de chaque fonction. Les complexités temporelles sont données
|
||||||
au pire cas, en faisant varier les tailles des données, même si leurs valeurs
|
au pire cas, en faisant varier les tailles des données, même si leurs valeurs
|
||||||
sont fixées par des constantes dans le programme. Les objectifs sont ceux
|
sont fixées par des constantes dans le programme. Les objectifs sont ceux
|
||||||
du tableau de la page 67 du TD ; ils restent à atteindre.
|
du tableau de la page 67 du TD ; la section 4 présente leur réalisation.
|
||||||
|
|
||||||
| ID | Fonction | Calcule | Actuelle | M | Objectif |
|
| ID | Fonction | Calcule | Actuelle | M | Objectif |
|
||||||
|:---:|---|---|---|:---:|---|
|
|:---:|---|---|---|:---:|---|
|
||||||
@@ -261,7 +261,7 @@ Un tableau de `C` indicateurs, initialisé à zéro, remplace la recherche
|
|||||||
dans les transactions précédentes. Une transaction marque son client à son
|
dans les transactions précédentes. Une transaction marque son client à son
|
||||||
premier passage et incrémente le compteur. Le coût devient **`O(n + C)`**
|
premier passage et incrémente le compteur. Le coût devient **`O(n + C)`**
|
||||||
au lieu de `O(n²)`, avec `O(C)` de mémoire. Les identifiants de clients sont
|
au lieu de `O(n²)`, avec `O(C)` de mémoire. Les identifiants de clients sont
|
||||||
densement compris entre 0 et `C - 1`, comme le garantit le générateur.
|
compris entre 0 et `C - 1`, comme le garantit le générateur.
|
||||||
La complexité cyclomatique passe de **5 à 3**. Les tests couvrent l'absence
|
La complexité cyclomatique passe de **5 à 3**. Les tests couvrent l'absence
|
||||||
de transactions, les doublons, les identifiants extrêmes et tous les clients.
|
de transactions, les doublons, les identifiants extrêmes et tous les clients.
|
||||||
|
|
||||||
@@ -364,3 +364,137 @@ dépassant l'objectif. Les tests confrontent les 20 montants situés aux
|
|||||||
seuils et à leurs voisins, y compris `LONG_MIN` et `LONG_MAX`, à la fonction
|
seuils et à leurs voisins, y compris `LONG_MIN` et `LONG_MAX`, à la fonction
|
||||||
initiale, pour 20 clients et 210 jours (cycle commun des modulos 7 et 30),
|
initiale, pour 20 clients et 210 jours (cycle commun des modulos 7 et 30),
|
||||||
soit **84 000 classifications**.
|
soit **84 000 classifications**.
|
||||||
|
|
||||||
|
### F10 — Conserver la fin du rapport
|
||||||
|
|
||||||
|
`ajouter_ligne` reçoit le pointeur sur le caractère nul final, copie la ligne
|
||||||
|
et renvoie le nouveau pointeur de fin. `main` le conserve entre les appels.
|
||||||
|
La fonction `longueur` disparaît : les caractères déjà écrits ne sont plus
|
||||||
|
relus. Un ajout coûte **`O(l)`** pour une ligne de longueur `l`, et la
|
||||||
|
construction complète **`O(L)`** au lieu de `O(L²)` pour des lignes de taille
|
||||||
|
bornée. La mémoire auxiliaire reste **`O(1)`** et F10 garde **M = 2**.
|
||||||
|
|
||||||
|
Les tests vérifient la concaténation et le pointeur renvoyé après 200 ajouts,
|
||||||
|
les lignes vides et une ligne remplissant exactement le tampon disponible.
|
||||||
|
Le rapport complet garde ses **6 017 lignes et 120 348 octets**.
|
||||||
|
|
||||||
|
### Bilan des complexités
|
||||||
|
|
||||||
|
| Fonction | Avant | Après | M avant → après |
|
||||||
|
|---|---|---|:---:|
|
||||||
|
| F1 | `O(n²)` | `O(n log n)` au pire cas | 6 → 3 |
|
||||||
|
| F2 | `O(n²)` | `O(n + C)` | 5 → 3 |
|
||||||
|
| F3 | `O(n × C)` | `O(n + C)` | 4 → 3 |
|
||||||
|
| F4 | `O(n × J)` | `O(n + J)` | 4 → 3 |
|
||||||
|
| F5 | `O(J³)` | `O(J)` | 5 → 4 |
|
||||||
|
| F6 | `O(n)` par requête | `O(1)` par requête après indexation `O(n)` | 3 → 3 |
|
||||||
|
| F7 | `O(n²)` | `O(n log n)` | 4 → 3 |
|
||||||
|
| F8 | `O(2^(S + k))`, borne générale | `O(S × k)` pour `k ≥ 1` | 4 → 5 |
|
||||||
|
| F9 | `O(1)` | `O(1)` | 14 → 3 |
|
||||||
|
| F10 | `O(L²)` au total, lignes de taille bornée | `O(L)` au total | 2 → 2 |
|
||||||
|
|
||||||
|
M des auxiliaires ajoutés : `comparer_transactions` **2**,
|
||||||
|
`trier_intervalle` **6**, `indexer_par_id` **2**,
|
||||||
|
`compter_paires_triees` **9**, `categorie_debit` **5**,
|
||||||
|
`categorie_credit` **7**. Avec **M = 9** pour `main`, le maximum hors
|
||||||
|
génération est désormais **9**, contre **14** initialement.
|
||||||
|
|
||||||
|
### Validation à chaque commit et mesure finale
|
||||||
|
|
||||||
|
Le journal [validations_optimisations.csv](build/validations_optimisations.csv)
|
||||||
|
conserve les dix vérifications successives : fonction optimisée, empreinte,
|
||||||
|
égalité du rapport, temps d'une exécution et SHA-256 du fichier `banque.c`
|
||||||
|
testé. Chaque ligne correspond au code du commit de cette optimisation.
|
||||||
|
Les dix empreintes sont **`ff68d260a7a58441`**, et les dix rapports sont
|
||||||
|
identiques octet par octet à celui de la version initiale.
|
||||||
|
|
||||||
|
La validation finale comprend :
|
||||||
|
|
||||||
|
- `make test` : tests de cas limites et comparaisons aux versions de référence ;
|
||||||
|
- `make check` : compilation en `-O2` et vérification de l'empreinte ;
|
||||||
|
- `make profile` : compilation en `-O0 -g -pg`, même sortie et même rapport ;
|
||||||
|
- les tests et une exécution complète compilés avec
|
||||||
|
`-O1 -g -fsanitize=address,undefined -fno-omit-frame-pointer` : aucune erreur
|
||||||
|
mémoire ou de comportement indéfini signalée ;
|
||||||
|
- comparaison du code : constantes, génération des données et chaînes de
|
||||||
|
formatage du rapport inchangées.
|
||||||
|
|
||||||
|
La commande pour relancer les tests avec les vérifications mémoire est :
|
||||||
|
|
||||||
|
```bash
|
||||||
|
make test CFLAGS='-std=c11 -Wall -Wextra -Wpedantic -O1 -g -fsanitize=address,undefined -fno-omit-frame-pointer'
|
||||||
|
```
|
||||||
|
|
||||||
|
Une nouvelle exécution de la version initiale prend **2,437683 s**. Pour
|
||||||
|
la version finale compilée avec les mêmes options en `-O2`, les cinq temps
|
||||||
|
réels sont **0,010910 ; 0,011111 ; 0,010734 ; 0,011242 ; 0,010525 s**,
|
||||||
|
soit une médiane de **0,010910 s**, environ **11 ms**. Les mesures utilisent
|
||||||
|
`time.perf_counter()` autour du processus entier et incluent l'écriture du
|
||||||
|
rapport ; elles sont conservées dans [temps_apres.txt](build/temps_apres.txt).
|
||||||
|
La référence étant une seule exécution et les temps dépendant de la machine,
|
||||||
|
cette comparaison donne un ordre de grandeur du gain, pas un classement.
|
||||||
|
|
||||||
|
### Profil gprof après optimisation
|
||||||
|
|
||||||
|
Le profil d'une exécution finale est conservé dans
|
||||||
|
[profil_apres.txt](build/profil/profil_apres.txt), ainsi que dans le fichier
|
||||||
|
courant [profil.txt](build/profil/profil.txt). Il a été obtenu avec :
|
||||||
|
|
||||||
|
```bash
|
||||||
|
make profile
|
||||||
|
cp build/profil/profil.txt build/profil/profil_apres.txt
|
||||||
|
```
|
||||||
|
|
||||||
|
Cette exécution ne fournit qu'environ **0,01 s échantillonnée**, attribuée
|
||||||
|
au tri fusion. Un seul échantillon ne permet pas d'interpréter les parts de
|
||||||
|
temps. Pour mieux distinguer les coûts restants, le programme complet est
|
||||||
|
donc répété **200 fois dans le même processus instrumenté**, avec remise à
|
||||||
|
la graine initiale entre les passages. La sortie standard est redirigée,
|
||||||
|
le rapport est toujours écrit, et le dernier rapport est comparé à la
|
||||||
|
référence. Cette répétition concerne uniquement le pilote de mesure ;
|
||||||
|
`banque.c` et ses constantes ne sont pas modifiés.
|
||||||
|
|
||||||
|
Le profil cumulé est enregistré dans
|
||||||
|
[profil_apres_repete.txt](build/profil/profil_apres_repete.txt). Il représente
|
||||||
|
environ **2,07 s de temps CPU échantillonné pour 200 traitements** : les
|
||||||
|
nombres d'appels et les temps du tableau suivant sont ceux du lot entier.
|
||||||
|
|
||||||
|
| Fonction | Appels hors récursion | Temps propre cumulé (s) | Part du temps |
|
||||||
|
|---|---:|---:|---:|
|
||||||
|
| `trier_intervalle` | 400 | 1,19 | 57,25 % |
|
||||||
|
| `comparer_transactions` | 163 486 000 | 0,29 | 14,01 % |
|
||||||
|
| `generer_transactions` | 200 | 0,14 | 6,76 % |
|
||||||
|
| `compter_paires_triees` | 200 | 0,08 | 3,86 % |
|
||||||
|
| `ajouter_ligne` | 1 203 400 | 0,04 | 1,93 % |
|
||||||
|
| `rechercher_par_id` | 6 000 000 | 0,01 | 0,48 % |
|
||||||
|
| `meilleure_periode` | 200 | 0,00 | 0,00 % |
|
||||||
|
| `nb_facons_rendre` | 200 | 0,00 | 0,00 % |
|
||||||
|
|
||||||
|
Les deux tris de chaque traitement, celui de F7 sur une copie et celui du
|
||||||
|
rapport, expliquent les 400 appels initiaux de `trier_intervalle`. Le tri
|
||||||
|
fusion et ses comparaisons représentent désormais l'essentiel du coût.
|
||||||
|
Les centaines de millions d'appels récursifs de F8 ont disparu, les
|
||||||
|
recherches F6 coûtent très peu et F10 ne rescane plus les préfixes du
|
||||||
|
rapport. Les valeurs à 0,00 s restent des arrondis de l'échantillonnage.
|
||||||
|
Les durées brutes de ce lot ne se comparent pas à celles du profil initial
|
||||||
|
sur une seule exécution, ni aux temps réels mesurés en `-O2`.
|
||||||
|
|
||||||
|
Pour reproduire ce profil cumulé depuis la racine :
|
||||||
|
|
||||||
|
```bash
|
||||||
|
tmp_profil=$(mktemp -d)
|
||||||
|
gcc -std=c11 -Wall -Wextra -Wpedantic -O0 -g -pg -x c -o "$tmp_profil/banque" - <<EOF
|
||||||
|
#define main banque_main
|
||||||
|
#include "$(pwd)/banque.c"
|
||||||
|
#undef main
|
||||||
|
int main(void) {
|
||||||
|
for (int i = 0; i < 200; i++) {
|
||||||
|
etat_alea = GRAINE;
|
||||||
|
if (banque_main() != 0) return EXIT_FAILURE;
|
||||||
|
}
|
||||||
|
return EXIT_SUCCESS;
|
||||||
|
}
|
||||||
|
EOF
|
||||||
|
(cd "$tmp_profil" && ./banque > /dev/null && gprof -b ./banque gmon.out) > build/profil/profil_apres_repete.txt
|
||||||
|
rm -rf "$tmp_profil"
|
||||||
|
```
|
||||||
|
|||||||
@@ -300,23 +300,13 @@ int categorie(const Transaction *t)
|
|||||||
}
|
}
|
||||||
|
|
||||||
/* F10 : ajoute une ligne à la fin du rapport */
|
/* F10 : ajoute une ligne à la fin du rapport */
|
||||||
int longueur(const char *s)
|
/* fin_rapport désigne le '\0' courant ; l'appelant conserve la nouvelle fin. */
|
||||||
|
char *ajouter_ligne(char *fin_rapport, const char *ligne)
|
||||||
{
|
{
|
||||||
int n = 0;
|
while (*ligne != '\0')
|
||||||
while (s[n] != '\0')
|
*fin_rapport++ = *ligne++;
|
||||||
n++;
|
*fin_rapport = '\0';
|
||||||
return n;
|
return fin_rapport;
|
||||||
}
|
|
||||||
|
|
||||||
void ajouter_ligne(char *rapport, const char *ligne)
|
|
||||||
{
|
|
||||||
int fin = longueur(rapport);
|
|
||||||
int i = 0;
|
|
||||||
while (ligne[i] != '\0') {
|
|
||||||
rapport[fin + i] = ligne[i];
|
|
||||||
i++;
|
|
||||||
}
|
|
||||||
rapport[fin + i] = '\0';
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/* ------------------------------------------------------------------ */
|
/* ------------------------------------------------------------------ */
|
||||||
@@ -339,6 +329,7 @@ int main(void)
|
|||||||
char *rapport = malloc(1 << 20);
|
char *rapport = malloc(1 << 20);
|
||||||
char ligne[128];
|
char ligne[128];
|
||||||
rapport[0] = '\0';
|
rapport[0] = '\0';
|
||||||
|
char *fin_rapport = rapport;
|
||||||
|
|
||||||
/* recherches par id, dans l'ordre d'origine */
|
/* recherches par id, dans l'ordre d'origine */
|
||||||
static const Transaction *index_ids[NB_TRANSACTIONS];
|
static const Transaction *index_ids[NB_TRANSACTIONS];
|
||||||
@@ -374,30 +365,30 @@ int main(void)
|
|||||||
|
|
||||||
/* rapport */
|
/* rapport */
|
||||||
snprintf(ligne, sizeof(ligne), "clients distincts;%d\n", nb_clients);
|
snprintf(ligne, sizeof(ligne), "clients distincts;%d\n", nb_clients);
|
||||||
ajouter_ligne(rapport, ligne);
|
fin_rapport = ajouter_ligne(fin_rapport, ligne);
|
||||||
snprintf(ligne, sizeof(ligne), "somme des requetes;%ld\n", somme_requetes);
|
snprintf(ligne, sizeof(ligne), "somme des requetes;%ld\n", somme_requetes);
|
||||||
ajouter_ligne(rapport, ligne);
|
fin_rapport = ajouter_ligne(fin_rapport, ligne);
|
||||||
snprintf(ligne, sizeof(ligne), "meilleure periode;%d;%d;%ld\n", debut, fin, meilleure);
|
snprintf(ligne, sizeof(ligne), "meilleure periode;%d;%d;%ld\n", debut, fin, meilleure);
|
||||||
ajouter_ligne(rapport, ligne);
|
fin_rapport = ajouter_ligne(fin_rapport, ligne);
|
||||||
snprintf(ligne, sizeof(ligne), "paires opposees;%ld\n", nb_paires);
|
snprintf(ligne, sizeof(ligne), "paires opposees;%ld\n", nb_paires);
|
||||||
ajouter_ligne(rapport, ligne);
|
fin_rapport = ajouter_ligne(fin_rapport, ligne);
|
||||||
snprintf(ligne, sizeof(ligne), "facons de rendre %d;%ld\n", MONTANT_MONNAIE, nb_facons);
|
snprintf(ligne, sizeof(ligne), "facons de rendre %d;%ld\n", MONTANT_MONNAIE, nb_facons);
|
||||||
ajouter_ligne(rapport, ligne);
|
fin_rapport = ajouter_ligne(fin_rapport, ligne);
|
||||||
for (int c = 0; c < 12; c++) {
|
for (int c = 0; c < 12; c++) {
|
||||||
snprintf(ligne, sizeof(ligne), "categorie;%d;%d\n", c, categories[c]);
|
snprintf(ligne, sizeof(ligne), "categorie;%d;%d\n", c, categories[c]);
|
||||||
ajouter_ligne(rapport, ligne);
|
fin_rapport = ajouter_ligne(fin_rapport, ligne);
|
||||||
}
|
}
|
||||||
for (int c = 0; c < NB_CLIENTS; c++) {
|
for (int c = 0; c < NB_CLIENTS; c++) {
|
||||||
snprintf(ligne, sizeof(ligne), "client;%d;%ld\n", c, totaux_clients[c]);
|
snprintf(ligne, sizeof(ligne), "client;%d;%ld\n", c, totaux_clients[c]);
|
||||||
ajouter_ligne(rapport, ligne);
|
fin_rapport = ajouter_ligne(fin_rapport, ligne);
|
||||||
}
|
}
|
||||||
for (int j = 0; j < NB_JOURS; j++) {
|
for (int j = 0; j < NB_JOURS; j++) {
|
||||||
snprintf(ligne, sizeof(ligne), "jour;%d;%ld\n", j, totaux_jours[j]);
|
snprintf(ligne, sizeof(ligne), "jour;%d;%ld\n", j, totaux_jours[j]);
|
||||||
ajouter_ligne(rapport, ligne);
|
fin_rapport = ajouter_ligne(fin_rapport, ligne);
|
||||||
}
|
}
|
||||||
for (int i = 0; i < NB_TRANSACTIONS; i += 10) {
|
for (int i = 0; i < NB_TRANSACTIONS; i += 10) {
|
||||||
snprintf(ligne, sizeof(ligne), "rang;%d;%d;%ld\n", i, t[i].id, t[i].montant);
|
snprintf(ligne, sizeof(ligne), "rang;%d;%d;%ld\n", i, t[i].id, t[i].montant);
|
||||||
ajouter_ligne(rapport, ligne);
|
fin_rapport = ajouter_ligne(fin_rapport, ligne);
|
||||||
}
|
}
|
||||||
|
|
||||||
FILE *f = fopen("rapport.txt", "w");
|
FILE *f = fopen("rapport.txt", "w");
|
||||||
|
|||||||
Binary file not shown.
Binary file not shown.
Binary file not shown.
+109
-82
@@ -1,99 +1,126 @@
|
|||||||
Flat profile:
|
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 s/call s/call name
|
time seconds seconds calls ms/call ms/call name
|
||||||
48.60 3.13 3.13 1 3.13 3.13 trier_par_montant
|
100.00 0.01 0.01 2 5.00 5.00 trier_intervalle
|
||||||
13.20 3.98 0.85 30000 0.00 0.00 rechercher_par_id
|
0.00 0.01 0.00 817430 0.00 0.00 comparer_transactions
|
||||||
11.80 4.74 0.76 1 0.76 0.76 nb_paires_opposees
|
0.00 0.01 0.00 149998 0.00 0.00 alea
|
||||||
10.17 5.39 0.66 1 0.66 0.66 nb_facons_rendre
|
0.00 0.01 0.00 30000 0.00 0.00 categorie
|
||||||
6.37 5.80 0.41 6017 0.00 0.00 longueur
|
0.00 0.01 0.00 30000 0.00 0.00 rechercher_par_id
|
||||||
4.97 6.12 0.32 1 0.32 0.32 meilleure_periode
|
0.00 0.01 0.00 15066 0.00 0.00 categorie_debit
|
||||||
1.71 6.24 0.11 1 0.11 0.11 nb_clients_distincts
|
0.00 0.01 0.00 14934 0.00 0.00 categorie_credit
|
||||||
1.71 6.34 0.11 1 0.11 0.11 total_par_client
|
0.00 0.01 0.00 6017 0.00 0.00 ajouter_ligne
|
||||||
0.78 6.39 0.05 1 0.05 0.05 total_par_jour
|
0.00 0.01 0.00 2 0.00 5.00 trier_par_montant
|
||||||
0.39 6.42 0.03 30000 0.00 0.00 categorie
|
0.00 0.01 0.00 1 0.00 0.00 compter_paires_triees
|
||||||
0.31 6.44 0.02 _init
|
0.00 0.01 0.00 1 0.00 0.00 empreinte
|
||||||
0.00 6.44 0.00 149998 0.00 0.00 alea
|
0.00 0.01 0.00 1 0.00 0.00 generer_transactions
|
||||||
0.00 6.44 0.00 6017 0.00 0.00 ajouter_ligne
|
0.00 0.01 0.00 1 0.00 0.00 indexer_par_id
|
||||||
0.00 6.44 0.00 1 0.00 0.00 empreinte
|
0.00 0.01 0.00 1 0.00 0.00 meilleure_periode
|
||||||
0.00 6.44 0.00 1 0.00 0.00 generer_transactions
|
0.00 0.01 0.00 1 0.00 0.00 nb_clients_distincts
|
||||||
|
0.00 0.01 0.00 1 0.00 0.00 nb_facons_rendre
|
||||||
|
0.00 0.01 0.00 1 0.00 5.00 nb_paires_opposees
|
||||||
|
0.00 0.01 0.00 1 0.00 0.00 total_par_client
|
||||||
|
0.00 0.01 0.00 1 0.00 0.00 total_par_jour
|
||||||
|
|
||||||
|
|
||||||
Call graph
|
Call graph
|
||||||
|
|
||||||
|
|
||||||
granularity: each sample hit covers 4 byte(s) for 0.16% of 6.44 seconds
|
granularity: each sample hit covers 4 byte(s) for 100.00% of 0.01 seconds
|
||||||
|
|
||||||
index % time self children called name
|
index % time self children called name
|
||||||
<spontaneous>
|
119996 trier_intervalle [1]
|
||||||
[1] 99.7 0.00 6.42 main [1]
|
0.01 0.00 2/2 trier_par_montant [2]
|
||||||
3.13 0.00 1/1 trier_par_montant [2]
|
[1] 100.0 0.01 0.00 2+119996 trier_intervalle [1]
|
||||||
0.85 0.00 30000/30000 rechercher_par_id [3]
|
0.00 0.00 817430/817430 comparer_transactions [5]
|
||||||
0.76 0.00 1/1 nb_paires_opposees [4]
|
119996 trier_intervalle [1]
|
||||||
0.66 0.00 1/1 nb_facons_rendre [5]
|
|
||||||
0.00 0.41 6017/6017 ajouter_ligne [6]
|
|
||||||
0.32 0.00 1/1 meilleure_periode [8]
|
|
||||||
0.11 0.00 1/1 nb_clients_distincts [9]
|
|
||||||
0.11 0.00 1/1 total_par_client [10]
|
|
||||||
0.05 0.00 1/1 total_par_jour [11]
|
|
||||||
0.03 0.00 30000/30000 categorie [12]
|
|
||||||
0.00 0.00 1/1 generer_transactions [16]
|
|
||||||
0.00 0.00 1/1 empreinte [15]
|
|
||||||
-----------------------------------------------
|
-----------------------------------------------
|
||||||
3.13 0.00 1/1 main [1]
|
0.00 0.01 1/2 nb_paires_opposees [4]
|
||||||
[2] 48.6 3.13 0.00 1 trier_par_montant [2]
|
0.00 0.01 1/2 main [3]
|
||||||
-----------------------------------------------
|
[2] 100.0 0.00 0.01 2 trier_par_montant [2]
|
||||||
0.85 0.00 30000/30000 main [1]
|
0.01 0.00 2/2 trier_intervalle [1]
|
||||||
[3] 13.2 0.85 0.00 30000 rechercher_par_id [3]
|
|
||||||
-----------------------------------------------
|
|
||||||
0.76 0.00 1/1 main [1]
|
|
||||||
[4] 11.8 0.76 0.00 1 nb_paires_opposees [4]
|
|
||||||
-----------------------------------------------
|
|
||||||
266723738 nb_facons_rendre [5]
|
|
||||||
0.66 0.00 1/1 main [1]
|
|
||||||
[5] 10.2 0.66 0.00 1+266723738 nb_facons_rendre [5]
|
|
||||||
266723738 nb_facons_rendre [5]
|
|
||||||
-----------------------------------------------
|
|
||||||
0.00 0.41 6017/6017 main [1]
|
|
||||||
[6] 6.4 0.00 0.41 6017 ajouter_ligne [6]
|
|
||||||
0.41 0.00 6017/6017 longueur [7]
|
|
||||||
-----------------------------------------------
|
|
||||||
0.41 0.00 6017/6017 ajouter_ligne [6]
|
|
||||||
[7] 6.4 0.41 0.00 6017 longueur [7]
|
|
||||||
-----------------------------------------------
|
|
||||||
0.32 0.00 1/1 main [1]
|
|
||||||
[8] 5.0 0.32 0.00 1 meilleure_periode [8]
|
|
||||||
-----------------------------------------------
|
|
||||||
0.11 0.00 1/1 main [1]
|
|
||||||
[9] 1.7 0.11 0.00 1 nb_clients_distincts [9]
|
|
||||||
-----------------------------------------------
|
|
||||||
0.11 0.00 1/1 main [1]
|
|
||||||
[10] 1.7 0.11 0.00 1 total_par_client [10]
|
|
||||||
-----------------------------------------------
|
|
||||||
0.05 0.00 1/1 main [1]
|
|
||||||
[11] 0.8 0.05 0.00 1 total_par_jour [11]
|
|
||||||
-----------------------------------------------
|
|
||||||
0.03 0.00 30000/30000 main [1]
|
|
||||||
[12] 0.4 0.03 0.00 30000 categorie [12]
|
|
||||||
-----------------------------------------------
|
-----------------------------------------------
|
||||||
<spontaneous>
|
<spontaneous>
|
||||||
[13] 0.3 0.02 0.00 _init [13]
|
[3] 100.0 0.00 0.01 main [3]
|
||||||
|
0.00 0.01 1/1 nb_paires_opposees [4]
|
||||||
|
0.00 0.01 1/2 trier_par_montant [2]
|
||||||
|
0.00 0.00 30000/30000 rechercher_par_id [8]
|
||||||
|
0.00 0.00 30000/30000 categorie [7]
|
||||||
|
0.00 0.00 6017/6017 ajouter_ligne [11]
|
||||||
|
0.00 0.00 1/1 generer_transactions [14]
|
||||||
|
0.00 0.00 1/1 indexer_par_id [15]
|
||||||
|
0.00 0.00 1/1 nb_clients_distincts [17]
|
||||||
|
0.00 0.00 1/1 total_par_client [19]
|
||||||
|
0.00 0.00 1/1 total_par_jour [20]
|
||||||
|
0.00 0.00 1/1 meilleure_periode [16]
|
||||||
|
0.00 0.00 1/1 nb_facons_rendre [18]
|
||||||
|
0.00 0.00 1/1 empreinte [13]
|
||||||
-----------------------------------------------
|
-----------------------------------------------
|
||||||
0.00 0.00 149998/149998 generer_transactions [16]
|
0.00 0.01 1/1 main [3]
|
||||||
[14] 0.0 0.00 0.00 149998 alea [14]
|
[4] 50.0 0.00 0.01 1 nb_paires_opposees [4]
|
||||||
|
0.00 0.01 1/2 trier_par_montant [2]
|
||||||
|
0.00 0.00 1/1 compter_paires_triees [12]
|
||||||
-----------------------------------------------
|
-----------------------------------------------
|
||||||
0.00 0.00 1/1 main [1]
|
0.00 0.00 817430/817430 trier_intervalle [1]
|
||||||
[15] 0.0 0.00 0.00 1 empreinte [15]
|
[5] 0.0 0.00 0.00 817430 comparer_transactions [5]
|
||||||
-----------------------------------------------
|
-----------------------------------------------
|
||||||
0.00 0.00 1/1 main [1]
|
0.00 0.00 149998/149998 generer_transactions [14]
|
||||||
[16] 0.0 0.00 0.00 1 generer_transactions [16]
|
[6] 0.0 0.00 0.00 149998 alea [6]
|
||||||
0.00 0.00 149998/149998 alea [14]
|
|
||||||
-----------------------------------------------
|
-----------------------------------------------
|
||||||
|
0.00 0.00 30000/30000 main [3]
|
||||||
|
[7] 0.0 0.00 0.00 30000 categorie [7]
|
||||||
|
0.00 0.00 15066/15066 categorie_debit [9]
|
||||||
|
0.00 0.00 14934/14934 categorie_credit [10]
|
||||||
|
-----------------------------------------------
|
||||||
|
0.00 0.00 30000/30000 main [3]
|
||||||
|
[8] 0.0 0.00 0.00 30000 rechercher_par_id [8]
|
||||||
|
-----------------------------------------------
|
||||||
|
0.00 0.00 15066/15066 categorie [7]
|
||||||
|
[9] 0.0 0.00 0.00 15066 categorie_debit [9]
|
||||||
|
-----------------------------------------------
|
||||||
|
0.00 0.00 14934/14934 categorie [7]
|
||||||
|
[10] 0.0 0.00 0.00 14934 categorie_credit [10]
|
||||||
|
-----------------------------------------------
|
||||||
|
0.00 0.00 6017/6017 main [3]
|
||||||
|
[11] 0.0 0.00 0.00 6017 ajouter_ligne [11]
|
||||||
|
-----------------------------------------------
|
||||||
|
0.00 0.00 1/1 nb_paires_opposees [4]
|
||||||
|
[12] 0.0 0.00 0.00 1 compter_paires_triees [12]
|
||||||
|
-----------------------------------------------
|
||||||
|
0.00 0.00 1/1 main [3]
|
||||||
|
[13] 0.0 0.00 0.00 1 empreinte [13]
|
||||||
|
-----------------------------------------------
|
||||||
|
0.00 0.00 1/1 main [3]
|
||||||
|
[14] 0.0 0.00 0.00 1 generer_transactions [14]
|
||||||
|
0.00 0.00 149998/149998 alea [6]
|
||||||
|
-----------------------------------------------
|
||||||
|
0.00 0.00 1/1 main [3]
|
||||||
|
[15] 0.0 0.00 0.00 1 indexer_par_id [15]
|
||||||
|
-----------------------------------------------
|
||||||
|
0.00 0.00 1/1 main [3]
|
||||||
|
[16] 0.0 0.00 0.00 1 meilleure_periode [16]
|
||||||
|
-----------------------------------------------
|
||||||
|
0.00 0.00 1/1 main [3]
|
||||||
|
[17] 0.0 0.00 0.00 1 nb_clients_distincts [17]
|
||||||
|
-----------------------------------------------
|
||||||
|
0.00 0.00 1/1 main [3]
|
||||||
|
[18] 0.0 0.00 0.00 1 nb_facons_rendre [18]
|
||||||
|
-----------------------------------------------
|
||||||
|
0.00 0.00 1/1 main [3]
|
||||||
|
[19] 0.0 0.00 0.00 1 total_par_client [19]
|
||||||
|
-----------------------------------------------
|
||||||
|
0.00 0.00 1/1 main [3]
|
||||||
|
[20] 0.0 0.00 0.00 1 total_par_jour [20]
|
||||||
|
-----------------------------------------------
|
||||||
|
|
||||||
|
|
||||||
Index by function name
|
Index by function name
|
||||||
|
|
||||||
[13] _init [16] generer_transactions [4] nb_paires_opposees
|
[11] ajouter_ligne [13] empreinte [8] rechercher_par_id
|
||||||
[6] ajouter_ligne [7] longueur [3] rechercher_par_id
|
[6] alea [14] generer_transactions [19] total_par_client
|
||||||
[14] alea [8] meilleure_periode [10] total_par_client
|
[7] categorie [15] indexer_par_id [20] total_par_jour
|
||||||
[12] categorie [9] nb_clients_distincts [11] total_par_jour
|
[10] categorie_credit (banque.c) [16] meilleure_periode [1] trier_intervalle (banque.c)
|
||||||
[15] empreinte [5] nb_facons_rendre [2] trier_par_montant
|
[9] categorie_debit (banque.c) [17] nb_clients_distincts [2] trier_par_montant
|
||||||
|
[5] comparer_transactions (banque.c) [18] nb_facons_rendre
|
||||||
|
[12] compter_paires_triees (banque.c) [4] nb_paires_opposees
|
||||||
|
|||||||
@@ -0,0 +1,126 @@
|
|||||||
|
Flat profile:
|
||||||
|
|
||||||
|
Each sample counts as 0.01 seconds.
|
||||||
|
% cumulative self self total
|
||||||
|
time seconds seconds calls ms/call ms/call name
|
||||||
|
100.00 0.01 0.01 2 5.00 5.00 trier_intervalle
|
||||||
|
0.00 0.01 0.00 817430 0.00 0.00 comparer_transactions
|
||||||
|
0.00 0.01 0.00 149998 0.00 0.00 alea
|
||||||
|
0.00 0.01 0.00 30000 0.00 0.00 categorie
|
||||||
|
0.00 0.01 0.00 30000 0.00 0.00 rechercher_par_id
|
||||||
|
0.00 0.01 0.00 15066 0.00 0.00 categorie_debit
|
||||||
|
0.00 0.01 0.00 14934 0.00 0.00 categorie_credit
|
||||||
|
0.00 0.01 0.00 6017 0.00 0.00 ajouter_ligne
|
||||||
|
0.00 0.01 0.00 2 0.00 5.00 trier_par_montant
|
||||||
|
0.00 0.01 0.00 1 0.00 0.00 compter_paires_triees
|
||||||
|
0.00 0.01 0.00 1 0.00 0.00 empreinte
|
||||||
|
0.00 0.01 0.00 1 0.00 0.00 generer_transactions
|
||||||
|
0.00 0.01 0.00 1 0.00 0.00 indexer_par_id
|
||||||
|
0.00 0.01 0.00 1 0.00 0.00 meilleure_periode
|
||||||
|
0.00 0.01 0.00 1 0.00 0.00 nb_clients_distincts
|
||||||
|
0.00 0.01 0.00 1 0.00 0.00 nb_facons_rendre
|
||||||
|
0.00 0.01 0.00 1 0.00 5.00 nb_paires_opposees
|
||||||
|
0.00 0.01 0.00 1 0.00 0.00 total_par_client
|
||||||
|
0.00 0.01 0.00 1 0.00 0.00 total_par_jour
|
||||||
|
|
||||||
|
|
||||||
|
Call graph
|
||||||
|
|
||||||
|
|
||||||
|
granularity: each sample hit covers 4 byte(s) for 100.00% of 0.01 seconds
|
||||||
|
|
||||||
|
index % time self children called name
|
||||||
|
119996 trier_intervalle [1]
|
||||||
|
0.01 0.00 2/2 trier_par_montant [2]
|
||||||
|
[1] 100.0 0.01 0.00 2+119996 trier_intervalle [1]
|
||||||
|
0.00 0.00 817430/817430 comparer_transactions [5]
|
||||||
|
119996 trier_intervalle [1]
|
||||||
|
-----------------------------------------------
|
||||||
|
0.00 0.01 1/2 nb_paires_opposees [4]
|
||||||
|
0.00 0.01 1/2 main [3]
|
||||||
|
[2] 100.0 0.00 0.01 2 trier_par_montant [2]
|
||||||
|
0.01 0.00 2/2 trier_intervalle [1]
|
||||||
|
-----------------------------------------------
|
||||||
|
<spontaneous>
|
||||||
|
[3] 100.0 0.00 0.01 main [3]
|
||||||
|
0.00 0.01 1/1 nb_paires_opposees [4]
|
||||||
|
0.00 0.01 1/2 trier_par_montant [2]
|
||||||
|
0.00 0.00 30000/30000 rechercher_par_id [8]
|
||||||
|
0.00 0.00 30000/30000 categorie [7]
|
||||||
|
0.00 0.00 6017/6017 ajouter_ligne [11]
|
||||||
|
0.00 0.00 1/1 generer_transactions [14]
|
||||||
|
0.00 0.00 1/1 indexer_par_id [15]
|
||||||
|
0.00 0.00 1/1 nb_clients_distincts [17]
|
||||||
|
0.00 0.00 1/1 total_par_client [19]
|
||||||
|
0.00 0.00 1/1 total_par_jour [20]
|
||||||
|
0.00 0.00 1/1 meilleure_periode [16]
|
||||||
|
0.00 0.00 1/1 nb_facons_rendre [18]
|
||||||
|
0.00 0.00 1/1 empreinte [13]
|
||||||
|
-----------------------------------------------
|
||||||
|
0.00 0.01 1/1 main [3]
|
||||||
|
[4] 50.0 0.00 0.01 1 nb_paires_opposees [4]
|
||||||
|
0.00 0.01 1/2 trier_par_montant [2]
|
||||||
|
0.00 0.00 1/1 compter_paires_triees [12]
|
||||||
|
-----------------------------------------------
|
||||||
|
0.00 0.00 817430/817430 trier_intervalle [1]
|
||||||
|
[5] 0.0 0.00 0.00 817430 comparer_transactions [5]
|
||||||
|
-----------------------------------------------
|
||||||
|
0.00 0.00 149998/149998 generer_transactions [14]
|
||||||
|
[6] 0.0 0.00 0.00 149998 alea [6]
|
||||||
|
-----------------------------------------------
|
||||||
|
0.00 0.00 30000/30000 main [3]
|
||||||
|
[7] 0.0 0.00 0.00 30000 categorie [7]
|
||||||
|
0.00 0.00 15066/15066 categorie_debit [9]
|
||||||
|
0.00 0.00 14934/14934 categorie_credit [10]
|
||||||
|
-----------------------------------------------
|
||||||
|
0.00 0.00 30000/30000 main [3]
|
||||||
|
[8] 0.0 0.00 0.00 30000 rechercher_par_id [8]
|
||||||
|
-----------------------------------------------
|
||||||
|
0.00 0.00 15066/15066 categorie [7]
|
||||||
|
[9] 0.0 0.00 0.00 15066 categorie_debit [9]
|
||||||
|
-----------------------------------------------
|
||||||
|
0.00 0.00 14934/14934 categorie [7]
|
||||||
|
[10] 0.0 0.00 0.00 14934 categorie_credit [10]
|
||||||
|
-----------------------------------------------
|
||||||
|
0.00 0.00 6017/6017 main [3]
|
||||||
|
[11] 0.0 0.00 0.00 6017 ajouter_ligne [11]
|
||||||
|
-----------------------------------------------
|
||||||
|
0.00 0.00 1/1 nb_paires_opposees [4]
|
||||||
|
[12] 0.0 0.00 0.00 1 compter_paires_triees [12]
|
||||||
|
-----------------------------------------------
|
||||||
|
0.00 0.00 1/1 main [3]
|
||||||
|
[13] 0.0 0.00 0.00 1 empreinte [13]
|
||||||
|
-----------------------------------------------
|
||||||
|
0.00 0.00 1/1 main [3]
|
||||||
|
[14] 0.0 0.00 0.00 1 generer_transactions [14]
|
||||||
|
0.00 0.00 149998/149998 alea [6]
|
||||||
|
-----------------------------------------------
|
||||||
|
0.00 0.00 1/1 main [3]
|
||||||
|
[15] 0.0 0.00 0.00 1 indexer_par_id [15]
|
||||||
|
-----------------------------------------------
|
||||||
|
0.00 0.00 1/1 main [3]
|
||||||
|
[16] 0.0 0.00 0.00 1 meilleure_periode [16]
|
||||||
|
-----------------------------------------------
|
||||||
|
0.00 0.00 1/1 main [3]
|
||||||
|
[17] 0.0 0.00 0.00 1 nb_clients_distincts [17]
|
||||||
|
-----------------------------------------------
|
||||||
|
0.00 0.00 1/1 main [3]
|
||||||
|
[18] 0.0 0.00 0.00 1 nb_facons_rendre [18]
|
||||||
|
-----------------------------------------------
|
||||||
|
0.00 0.00 1/1 main [3]
|
||||||
|
[19] 0.0 0.00 0.00 1 total_par_client [19]
|
||||||
|
-----------------------------------------------
|
||||||
|
0.00 0.00 1/1 main [3]
|
||||||
|
[20] 0.0 0.00 0.00 1 total_par_jour [20]
|
||||||
|
-----------------------------------------------
|
||||||
|
|
||||||
|
|
||||||
|
Index by function name
|
||||||
|
|
||||||
|
[11] ajouter_ligne [13] empreinte [8] rechercher_par_id
|
||||||
|
[6] alea [14] generer_transactions [19] total_par_client
|
||||||
|
[7] categorie [15] indexer_par_id [20] total_par_jour
|
||||||
|
[10] categorie_credit (banque.c) [16] meilleure_periode [1] trier_intervalle (banque.c)
|
||||||
|
[9] categorie_debit (banque.c) [17] nb_clients_distincts [2] trier_par_montant
|
||||||
|
[5] comparer_transactions (banque.c) [18] nb_facons_rendre
|
||||||
|
[12] compter_paires_triees (banque.c) [4] nb_paires_opposees
|
||||||
@@ -0,0 +1,135 @@
|
|||||||
|
Flat profile:
|
||||||
|
|
||||||
|
Each sample counts as 0.01 seconds.
|
||||||
|
% cumulative self self total
|
||||||
|
time seconds seconds calls ms/call ms/call name
|
||||||
|
57.25 1.19 1.19 400 2.96 3.69 trier_intervalle
|
||||||
|
14.01 1.48 0.29 163486000 0.00 0.00 comparer_transactions
|
||||||
|
6.76 1.61 0.14 200 0.70 0.75 generer_transactions
|
||||||
|
4.35 1.71 0.09 200 0.45 10.00 banque_main
|
||||||
|
3.86 1.78 0.08 200 0.40 0.40 compter_paires_triees
|
||||||
|
3.38 1.85 0.07 _init
|
||||||
|
2.90 1.92 0.06 200 0.30 0.30 empreinte
|
||||||
|
1.93 1.96 0.04 1203400 0.00 0.00 ajouter_ligne
|
||||||
|
0.97 1.98 0.02 6000000 0.00 0.00 categorie
|
||||||
|
0.97 2.00 0.02 200 0.10 0.10 nb_clients_distincts
|
||||||
|
0.97 2.02 0.02 200 0.10 0.10 total_par_client
|
||||||
|
0.48 2.02 0.01 29999600 0.00 0.00 alea
|
||||||
|
0.48 2.04 0.01 6000000 0.00 0.00 rechercher_par_id
|
||||||
|
0.48 2.04 0.01 3013200 0.00 0.00 categorie_debit
|
||||||
|
0.48 2.06 0.01 200 0.05 0.05 indexer_par_id
|
||||||
|
0.48 2.06 0.01 200 0.05 0.05 total_par_jour
|
||||||
|
0.24 2.07 0.01 400 0.01 3.70 trier_par_montant
|
||||||
|
0.00 2.07 0.00 2986800 0.00 0.00 categorie_credit
|
||||||
|
0.00 2.07 0.00 200 0.00 0.00 meilleure_periode
|
||||||
|
0.00 2.07 0.00 200 0.00 0.00 nb_facons_rendre
|
||||||
|
0.00 2.07 0.00 200 0.00 4.10 nb_paires_opposees
|
||||||
|
|
||||||
|
|
||||||
|
Call graph
|
||||||
|
|
||||||
|
|
||||||
|
granularity: each sample hit covers 4 byte(s) for 0.48% of 2.07 seconds
|
||||||
|
|
||||||
|
index % time self children called name
|
||||||
|
0.09 1.91 200/200 main [2]
|
||||||
|
[1] 96.6 0.09 1.91 200 banque_main [1]
|
||||||
|
0.00 0.82 200/200 nb_paires_opposees [5]
|
||||||
|
0.00 0.74 200/400 trier_par_montant [3]
|
||||||
|
0.14 0.01 200/200 generer_transactions [7]
|
||||||
|
0.06 0.00 200/200 empreinte [10]
|
||||||
|
0.04 0.00 1203400/1203400 ajouter_ligne [11]
|
||||||
|
0.02 0.01 6000000/6000000 categorie [12]
|
||||||
|
0.02 0.00 200/200 nb_clients_distincts [13]
|
||||||
|
0.02 0.00 200/200 total_par_client [14]
|
||||||
|
0.01 0.00 6000000/6000000 rechercher_par_id [16]
|
||||||
|
0.01 0.00 200/200 indexer_par_id [18]
|
||||||
|
0.01 0.00 200/200 total_par_jour [19]
|
||||||
|
0.00 0.00 200/200 meilleure_periode [21]
|
||||||
|
0.00 0.00 200/200 nb_facons_rendre [22]
|
||||||
|
-----------------------------------------------
|
||||||
|
<spontaneous>
|
||||||
|
[2] 96.6 0.00 2.00 main [2]
|
||||||
|
0.09 1.91 200/200 banque_main [1]
|
||||||
|
-----------------------------------------------
|
||||||
|
0.00 0.74 200/400 nb_paires_opposees [5]
|
||||||
|
0.00 0.74 200/400 banque_main [1]
|
||||||
|
[3] 71.5 0.01 1.48 400 trier_par_montant [3]
|
||||||
|
1.19 0.29 400/400 trier_intervalle [4]
|
||||||
|
-----------------------------------------------
|
||||||
|
23999200 trier_intervalle [4]
|
||||||
|
1.19 0.29 400/400 trier_par_montant [3]
|
||||||
|
[4] 71.3 1.19 0.29 400+23999200 trier_intervalle [4]
|
||||||
|
0.29 0.00 163486000/163486000 comparer_transactions [6]
|
||||||
|
23999200 trier_intervalle [4]
|
||||||
|
-----------------------------------------------
|
||||||
|
0.00 0.82 200/200 banque_main [1]
|
||||||
|
[5] 39.6 0.00 0.82 200 nb_paires_opposees [5]
|
||||||
|
0.00 0.74 200/400 trier_par_montant [3]
|
||||||
|
0.08 0.00 200/200 compter_paires_triees [8]
|
||||||
|
-----------------------------------------------
|
||||||
|
0.29 0.00 163486000/163486000 trier_intervalle [4]
|
||||||
|
[6] 14.0 0.29 0.00 163486000 comparer_transactions [6]
|
||||||
|
-----------------------------------------------
|
||||||
|
0.14 0.01 200/200 banque_main [1]
|
||||||
|
[7] 7.2 0.14 0.01 200 generer_transactions [7]
|
||||||
|
0.01 0.00 29999600/29999600 alea [15]
|
||||||
|
-----------------------------------------------
|
||||||
|
0.08 0.00 200/200 nb_paires_opposees [5]
|
||||||
|
[8] 3.9 0.08 0.00 200 compter_paires_triees [8]
|
||||||
|
-----------------------------------------------
|
||||||
|
<spontaneous>
|
||||||
|
[9] 3.4 0.07 0.00 _init [9]
|
||||||
|
-----------------------------------------------
|
||||||
|
0.06 0.00 200/200 banque_main [1]
|
||||||
|
[10] 2.9 0.06 0.00 200 empreinte [10]
|
||||||
|
-----------------------------------------------
|
||||||
|
0.04 0.00 1203400/1203400 banque_main [1]
|
||||||
|
[11] 1.9 0.04 0.00 1203400 ajouter_ligne [11]
|
||||||
|
-----------------------------------------------
|
||||||
|
0.02 0.01 6000000/6000000 banque_main [1]
|
||||||
|
[12] 1.4 0.02 0.01 6000000 categorie [12]
|
||||||
|
0.01 0.00 3013200/3013200 categorie_debit [17]
|
||||||
|
0.00 0.00 2986800/2986800 categorie_credit [20]
|
||||||
|
-----------------------------------------------
|
||||||
|
0.02 0.00 200/200 banque_main [1]
|
||||||
|
[13] 1.0 0.02 0.00 200 nb_clients_distincts [13]
|
||||||
|
-----------------------------------------------
|
||||||
|
0.02 0.00 200/200 banque_main [1]
|
||||||
|
[14] 1.0 0.02 0.00 200 total_par_client [14]
|
||||||
|
-----------------------------------------------
|
||||||
|
0.01 0.00 29999600/29999600 generer_transactions [7]
|
||||||
|
[15] 0.5 0.01 0.00 29999600 alea [15]
|
||||||
|
-----------------------------------------------
|
||||||
|
0.01 0.00 6000000/6000000 banque_main [1]
|
||||||
|
[16] 0.5 0.01 0.00 6000000 rechercher_par_id [16]
|
||||||
|
-----------------------------------------------
|
||||||
|
0.01 0.00 3013200/3013200 categorie [12]
|
||||||
|
[17] 0.5 0.01 0.00 3013200 categorie_debit [17]
|
||||||
|
-----------------------------------------------
|
||||||
|
0.01 0.00 200/200 banque_main [1]
|
||||||
|
[18] 0.5 0.01 0.00 200 indexer_par_id [18]
|
||||||
|
-----------------------------------------------
|
||||||
|
0.01 0.00 200/200 banque_main [1]
|
||||||
|
[19] 0.5 0.01 0.00 200 total_par_jour [19]
|
||||||
|
-----------------------------------------------
|
||||||
|
0.00 0.00 2986800/2986800 categorie [12]
|
||||||
|
[20] 0.0 0.00 0.00 2986800 categorie_credit [20]
|
||||||
|
-----------------------------------------------
|
||||||
|
0.00 0.00 200/200 banque_main [1]
|
||||||
|
[21] 0.0 0.00 0.00 200 meilleure_periode [21]
|
||||||
|
-----------------------------------------------
|
||||||
|
0.00 0.00 200/200 banque_main [1]
|
||||||
|
[22] 0.0 0.00 0.00 200 nb_facons_rendre [22]
|
||||||
|
-----------------------------------------------
|
||||||
|
|
||||||
|
|
||||||
|
Index by function name
|
||||||
|
|
||||||
|
[9] _init [6] comparer_transactions (banque.c) [22] nb_facons_rendre
|
||||||
|
[11] ajouter_ligne [8] compter_paires_triees (banque.c) [5] nb_paires_opposees
|
||||||
|
[15] alea [10] empreinte [16] rechercher_par_id
|
||||||
|
[1] banque_main [7] generer_transactions [14] total_par_client
|
||||||
|
[12] categorie [18] indexer_par_id [19] total_par_jour
|
||||||
|
[20] categorie_credit (banque.c) [21] meilleure_periode [4] trier_intervalle (banque.c)
|
||||||
|
[17] categorie_debit (banque.c) [13] nb_clients_distincts [3] trier_par_montant
|
||||||
@@ -0,0 +1,9 @@
|
|||||||
|
Mesures en secondes, gcc -std=c11 -Wall -Wextra -Wpedantic -O2
|
||||||
|
Commande : build/banque, rapport écrit sur disque, temps réel (perf_counter).
|
||||||
|
Référence initiale, une exécution : 2.437683
|
||||||
|
Exécution 1 : 0.010910
|
||||||
|
Exécution 2 : 0.011111
|
||||||
|
Exécution 3 : 0.010734
|
||||||
|
Exécution 4 : 0.011242
|
||||||
|
Exécution 5 : 0.010525
|
||||||
|
Médiane après optimisation : 0.010910
|
||||||
@@ -0,0 +1,11 @@
|
|||||||
|
fonction;empreinte;rapport_identique;temps_secondes;sha256_source
|
||||||
|
F1;ff68d260a7a58441;oui;0.941548;951d59178fee42db808259d2885504913006f2459be99a734619b322bf58011e
|
||||||
|
F2;ff68d260a7a58441;oui;0.939984;82088e5e81e3cd14319bbc3a3789ab76b3b1cdc54e92bf9e4811eadbce77d89a
|
||||||
|
F3;ff68d260a7a58441;oui;0.936668;e451e8d251c2194f63c631532d13b278242910977d7c597b9f27f5bbccb45522
|
||||||
|
F4;ff68d260a7a58441;oui;0.925947;d8ee027417c8bb3a49184191a27fcd4bd903c85341368c8574152171fae6086b
|
||||||
|
F5;ff68d260a7a58441;oui;0.844800;3ce8f93c61a31cea27e3da75c1edec7bde6ef0255037e1e39aa95680552e3f81
|
||||||
|
F6;ff68d260a7a58441;oui;0.643082;f3478bfeae098be4a35132c4e1b176c73ebe336134402419d1ddcc4607f3c45f
|
||||||
|
F7;ff68d260a7a58441;oui;0.382976;19a0887a08d835d94e0bf88491e9fa91810848eec0deb65cccdb7787e00a74f2
|
||||||
|
F8;ff68d260a7a58441;oui;0.131249;3e46c05cc55725fb26aa2b1f1e16b8882e6000708654638ef7f165c80ef0a2e8
|
||||||
|
F9;ff68d260a7a58441;oui;0.130851;98c643f223e4b721e01267431cb1bf8848a6772b6b3931ecd99731d0a7d0ffa8
|
||||||
|
F10;ff68d260a7a58441;oui;0.010753;504e876d5868aece17c7379d2e92f2e8dc8c49042f300bfe0b1114a0d8b13680
|
||||||
|
@@ -1,16 +1,20 @@
|
|||||||
# Analyse des fonctions avec valeurs initiales
|
# Complexités avant et après l'étape 4
|
||||||
|
|
||||||
| ID | Fonction | Calcule | Actuelle | Objectif |
|
| ID | Fonction | Avant | Après (objectif atteint) | M avant → après |
|
||||||
|:---:|---|---|:---:|---|
|
|:---:|---|---|---|:---:|
|
||||||
| F1 | `trier_par_montant` | tri des transactions | `O(n²)` | `O(n log n)` |
|
| F1 | `trier_par_montant` | `O(n²)` | `O(n log n)` au pire cas | 6 → 3 |
|
||||||
| F2 | `nb_clients_distincts` | clients différents | `O(n²)` | `O(n + C)` |
|
| F2 | `nb_clients_distincts` | `O(n²)` | `O(n + C)` | 5 → 3 |
|
||||||
| F3 | `total_par_client` | solde par client | `O(n * c)` | `O(n + C)` |
|
| F3 | `total_par_client` | `O(n × C)` | `O(n + C)` | 4 → 3 |
|
||||||
| F4 | `total_par_jour` | solde par jour | `O(n * J)` | `O(n + J)` |
|
| F4 | `total_par_jour` | `O(n × J)` | `O(n + J)` | 4 → 3 |
|
||||||
| F5 | `meilleure_periode` | période la plus rentable | `O(J³)` | `O(J)` |
|
| F5 | `meilleure_periode` | `O(J³)` | `O(J)` | 5 → 4 |
|
||||||
| F6 | `rechercher_par_id` | recherche par identifiant | `O(n)` | `O(1)` par requête |
|
| F6 | `rechercher_par_id` | `O(n)` par requête | `O(1)` par requête, après indexation `O(n)` | 3 → 3 |
|
||||||
| F7 | `nb_paires_opposees` | paires `a + b = 0` | `O(n²)` | `O(n log n)` |
|
| F7 | `nb_paires_opposees` | `O(n²)` | `O(n log n)` | 4 → 3 |
|
||||||
| F8 | `nb_facons_rendre` | rendu de monnaie | `O(Sⁿ)` | `O(S × k)` |
|
| F8 | `nb_facons_rendre` | `O(2^(S + k))`, borne générale | `O(S × k)` pour `k ≥ 1` | 4 → 5 |
|
||||||
| F9 | `categorie` | catégorie d'une transaction | M = 14 | `M ≤ 10` |
|
| F9 | `categorie` | `O(1)`, M = 14 | `O(1)`, M = 3 (auxiliaires : 5 et 7) | 14 → 3 |
|
||||||
| F10 | `ajouter_ligne` | construction du rapport | `O(n)` | `O(L)` au total |
|
| F10 | `ajouter_ligne` | `O(L²)` au total, lignes de taille bornée | `O(L)` au total | 2 → 2 |
|
||||||
|
|
||||||
`n` transactions · `C` clients · `J` jours · `S` somme · `k` pièces · `L` longueur du rapport · **F5, F7, F8** : les plus difficiles
|
`n` transactions · `C` clients · `J` jours · `S` somme · `k` pièces · `L` longueur du rapport.
|
||||||
|
|
||||||
|
Justifications, mémoire auxiliaire, M des fonctions auxiliaires et validations
|
||||||
|
dans `COMPTE_RENDU.md`, section 4. Les constantes et le format du rapport
|
||||||
|
sont inchangés ; l'empreinte reste `ff68d260a7a58441` à chaque optimisation.
|
||||||
|
|||||||
@@ -273,6 +273,35 @@ static void tester_categories(void)
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static void tester_rapport(void)
|
||||||
|
{
|
||||||
|
char rapport[4097] = "";
|
||||||
|
char attendu[4097] = "";
|
||||||
|
char *fin = rapport;
|
||||||
|
size_t taille = 0;
|
||||||
|
assert(ajouter_ligne(fin, "") == fin);
|
||||||
|
for (int i = 0; i < 200; i++) {
|
||||||
|
char ligne[20];
|
||||||
|
int longueur_ligne = snprintf(ligne, sizeof(ligne), "ligne;%d\n", i);
|
||||||
|
assert(longueur_ligne > 0);
|
||||||
|
assert((size_t)longueur_ligne < sizeof(ligne));
|
||||||
|
memcpy(attendu + taille, ligne, (size_t)longueur_ligne + 1);
|
||||||
|
taille += (size_t)longueur_ligne;
|
||||||
|
fin = ajouter_ligne(fin, ligne);
|
||||||
|
assert(fin == rapport + taille);
|
||||||
|
assert(*fin == '\0');
|
||||||
|
assert(strcmp(rapport, attendu) == 0);
|
||||||
|
assert(ajouter_ligne(fin, "") == fin);
|
||||||
|
}
|
||||||
|
char longue_ligne[4097];
|
||||||
|
memset(longue_ligne, 'x', sizeof(longue_ligne) - 1);
|
||||||
|
longue_ligne[sizeof(longue_ligne) - 1] = '\0';
|
||||||
|
rapport[0] = '\0';
|
||||||
|
fin = ajouter_ligne(rapport, longue_ligne);
|
||||||
|
assert(fin == rapport + sizeof(rapport) - 1);
|
||||||
|
assert(strcmp(rapport, longue_ligne) == 0);
|
||||||
|
}
|
||||||
|
|
||||||
int main(void)
|
int main(void)
|
||||||
{
|
{
|
||||||
tester_tri();
|
tester_tri();
|
||||||
@@ -284,6 +313,7 @@ int main(void)
|
|||||||
tester_paires();
|
tester_paires();
|
||||||
tester_monnaie();
|
tester_monnaie();
|
||||||
tester_categories();
|
tester_categories();
|
||||||
|
tester_rapport();
|
||||||
puts("Tests banque : OK");
|
puts("Tests banque : OK");
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user