jeudi 24 juillet 2025

Bonnes pratiques générales de performance



🔷 1. ✅ Bonnes pratiques générales de performance

Pratique Explication
Évitez les allocations inutiles Utilisez des structures (struct) pour les petits types, évitez les conversions implicites (boxing).
Utilisez les bons types de collection List<T> au lieu d’ArrayList, Dictionary<TKey, TValue> pour les recherches rapides.
Préferez foreach à for quand possible Plus lisible, mais attention au coût sur les collections non optimisées.
Réutilisez les objets Par exemple, évitez de recréer des objets comme HttpClient à chaque appel.
Favorisez les expressions LINQ simples LINQ est puissant mais peut être coûteux si mal utilisé. Privilégiez .ToList() uniquement quand nécessaire.

🔷 2. 💡 Optimisation mémoire et allocations

Pratique Exemple
Utilisez Span<T> / ReadOnlySpan<T> pour les gros tableaux (si .NET Core ou +) Span<char> évite des copies de chaînes.
Utilisez StringBuilder pour la concaténation répétée Ne faites pas str += "..."; dans une boucle.
Utilisez ArrayPool<T> pour recycler de gros tableaux Évite les GC sur les buffers volumineux.
Privilégiez readonly struct si l'objet ne change pas Moins de copies, plus de performance.

🔷 3. 🧠 Écriture de code efficace et lisible

Pratique Exemple
Nommez clairement vos méthodes / variables CalculateInvoiceTotal() > Calc().
Gardez les méthodes courtes et ciblées Une fonction = une responsabilité.
Évitez la duplication de code (DRY) Regroupez le code commun en méthodes.
Utilisez les interfaces pour tester et injecter Favorise le découplage.
Utilisez var intelligemment var quand le type est évident (var list = new List<string>())

🔷 4. 🧪 Profiling, benchmarking et analyse

Outil / Technique But
BenchmarkDotNet Pour comparer la performance de plusieurs méthodes
Visual Studio Diagnostic Tools Pour analyser la mémoire, les threads, le CPU
JetBrains dotMemory / dotTrace Pour profiler en profondeur
GC.GetTotalMemory() Pour estimer les allocations mémoire

🔷 5. 🧰 Exemples concrets de bonne optimisation

❌ Mauvais

string result = "";
for (int i = 0; i < 1000; i++)
{
    result += i.ToString();
}

✅ Bon

var sb = new StringBuilder();
for (int i = 0; i < 1000; i++)
{
    sb.Append(i);
}
string result = sb.ToString();

❌ Mauvais (LINQ mal utilisé)

var count = myList.Where(x => x > 10).Count();

✅ Bon

var count = myList.Count(x => x > 10);

✅ Récapitulatif des best practices C#

Catégorie Pratique essentielle
Performance Éviter les allocations, éviter le boxing
Mémoire Utiliser Span, ArrayPool, StringBuilder
Code propre Petites méthodes, noms clairs, DRY
Architecture Injection de dépendance, interfaces
Analyse BenchmarkDotNet, outils Visual Studio



Aucun commentaire:

Enregistrer un commentaire