F10 : construire le rapport en O(L) au total

ajouter_ligne recalculait la longueur du rapport à chaque ligne : 6 017
parcours d'un texte qui grandit jusqu'à la taille finale L, soit
O(L × nombre de lignes). ajouter_ligne reçoit désormais la position de
fin et renvoie la nouvelle : chaque caractère n'est écrit qu'une fois.
La fonction longueur n'est plus utilisée et disparaît.

Profil -O0 : longueur (1,74 s) disparaît. En -O2, le gain reste dans le
bruit de mesure. Empreinte inchangée (ff68d260a7a58441).

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
This commit is contained in:
2026-10-21 10:54:13 +02:00
parent d19085ed45
commit 4babca1f2e
+17 -26
View File
@@ -219,24 +219,14 @@ int categorie(const Transaction *t)
}
}
/* F10 : ajoute une ligne à la fin du rapport */
int longueur(const char *s)
/* F10 : ajoute une ligne à la fin du rapport. On passe la position du '\0'
* final et on renvoie la nouvelle : plus besoin de recalculer la longueur. */
char *ajouter_ligne(char *fin, const char *ligne)
{
int n = 0;
while (s[n] != '\0')
n++;
return n;
}
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';
while (*ligne != '\0')
*fin++ = *ligne++;
*fin = '\0';
return fin;
}
/* ------------------------------------------------------------------ */
@@ -259,6 +249,7 @@ int main(void)
char *rapport = malloc(1 << 20);
char ligne[128];
rapport[0] = '\0';
char *fin_rapport = rapport; /* position du '\0' final du rapport */
/* recherches par id, dans l'ordre d'origine */
long somme_requetes = 0;
@@ -292,30 +283,30 @@ int main(void)
/* rapport */
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);
ajouter_ligne(rapport, ligne);
fin_rapport = ajouter_ligne(fin_rapport, ligne);
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);
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);
ajouter_ligne(rapport, ligne);
fin_rapport = ajouter_ligne(fin_rapport, ligne);
for (int c = 0; c < 12; 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++) {
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++) {
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) {
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");