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 objetSolidColorBrush
, 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éfinisColors.Red
et autres couleurs statiquesPens.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.