Skip to content

Instantly share code, notes, and snippets.

@bizouarn
Last active March 20, 2025 18:21
Show Gist options
  • Save bizouarn/3e59408f9b5f457d3a73b0b83e1c07c6 to your computer and use it in GitHub Desktop.
Save bizouarn/3e59408f9b5f457d3a73b0b83e1c07c6 to your computer and use it in GitHub Desktop.
Benchmark qui compare l'instanciation d'un SolidColorBrush avec l'utilisation de l'instance statique Brushes.Red.

Benchmarking Brushes en .Net

Introduction

L'utilisation des objets graphiques en C# a un impact direct sur les performances et la gestion mémoire. Ce benchmark compare l'instanciation d'un SolidColorBrush avec l'utilisation de l'instance statique Brushes.Red.

Code du Benchmark

[ShortRunJob]
[MemoryDiagnoser]
public class BrushBench
{
    [Benchmark]
    public Brush New() => new SolidColorBrush(Colors.Red);

    [Benchmark]
    public Brush Static() => Brushes.Red;
}

Résultats

Method Mean Error StdDev Gen0 Allocated
New 140.61 ns 17.964 ns 0.985 ns 0.0279 176 B
Static 18.82 ns 3.287 ns 0.180 ns - -

Analyse

  • New() : Crée un nouvel objet SolidColorBrush, entraînant des allocations mémoire et un temps d'exécution plus long.
  • Static() : Réutilise une instance existante (Brushes.Red), éliminant les allocations et améliorant les performances.

L'instance statique est 8 fois plus rapide et sans allocation mémoire.

Bonnes Pratiques

1. Privilégier les Instances Statiques

Pour les objets fréquemment réutilisés :

  • Brushes.Red et autres pinceaux prédéfinis
  • Colors.Red et autres couleurs statiques
  • Pens.Black, Fonts.SystemFont, etc.

2. Créer une Palette Personnalisée

On peut définir des pinceaux statiques pour uniformiser l'affichage et éviter les allocations inutiles :

public static class CustomBrushes
{
    public static readonly Brush Primary = new SolidColorBrush(Color.FromRgb(34, 150, 243));
    public static readonly Brush Secondary = new SolidColorBrush(Color.FromRgb(243, 34, 150));
    public static readonly Brush Background = new SolidColorBrush(Color.FromRgb(240, 240, 240));
}

Une autre solution peut être de passer par un singleton.

3. Cas où une Instance Dynamique est Nécessaire

Créer un SolidColorBrush dynamique peut être justifié lorsque :

  • La couleur ne peut pas être prédite à l'avance.
  • Une modification de la transparence ou de la couleur est nécessaire à l'exécution.
  • Des animations doivent être appliquées sur un pinceau sans impacter les autres éléments statiques.

Conclusion

Utiliser Brushes.Red et d'autres instances statiques améliore significativement les performances et réduit les allocations mémoire. Cette approche peut être généralisée à d'autres types (Colors, Pens, Fonts).

Enfin, une classe statique regroupant des pinceaux personnalisés renforce l'organisation et optimise la gestion des ressources.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment