Une application écrite en C++ sous Linux à l'aide de la STL (Standard Template Library) s'exécutait beaucoup trop lentement et utilisait trop de mémoire. J'ai effectué une analyse du code et écrit un rapport dont voici quelques extraits.
Les conseils ont été suivis et les performances ont été améliorées dans la proportion prévue (temps divisés par 200).
Date | Heures | Motif |
---|---|---|
23-août | 3 | recherche d'informations sur implémentation actuelle avec ... |
24-août | 2 | lecture des documents complémentaires transmis par ... |
28-août | 1 | réunion avec ... et ... |
01-sept | 1 | écriture rapport |
total | 7 |
Modifier l'implémentation de la table des TEs
Cette table est implémentée sous forme de liste. La recherche d'un TE est donc proportionnelle au nombre de TEs.
En utilisant une map, le temps sera proportionnel à Log(N).
Estimation:
Je pense que le gain probable sera un facteur 200, car certains des blocs nécessaires resteront en mémoire en permanence, et le nombre de comparaisons joue quand même.
Utiliser des collections d'objets plutôt que des collections de pointeurs sur objets.
Comme la table est implémentée en utilisant la std::list de la STL, ce ne sera pas un gros travail de la transformer en utilisant la std::map. L'opérateur de comparaison nécessaire dans une map sera déduit de la fonction de comparaison actuelle.
Une liste de N objets est constituée de N blocs alloués séparément. Une liste de pointeurs sur objets est constituée de (2 * N) blocs.
Le temps de création de la liste sera divisé par 2. Le gain de mémoire sera au moins de (4 * N) octets. Comme la plupart des allocateurs attribuent des blocs de taille supérieure à la taille demandée, il sera probablement supérieur.
D'autre part cela simplifie en général le code. Il est de plus impossible d'oublier de libérer la mémoire.