Objectifs de la formation
- Faire monter en compétence des développeurs expérimentés en C# et DotNet vers DotNetCore
- Diagnostiquer les allocations mémoire et éviter les fuites mémoire
- Optimiser le code C# en référence aux dernières versions C#
- Optimiser et mesurer les gains de performances via le parallélisme
- Optimisation des bases de données
Programme de la formation
Présentation de .NET Core et .NET 6+
- Transition de .NET Framework vers .NET Core/.NET 6+: architecture, compatibilité.
- Avantages : performance, modularité, multiplateforme.
Travaux pratiques
Migrer un projet simple de .NET Framework 4.7.2 vers .NET Core 6., Comparer les performances avant/après la migration (utilisation mémoire et CPU)
Nouveautés C# 8 à C# 12
- Expressions switch, pattern matching amélioré, nullables, records, top-level statements, etc.
Travaux pratiques
Reprendre un ancien code C# et l’adapter en utilisant les nouvelles fonctionnalités C# (comme les records, le pattern matching).
Gestion mémoire en .NET Core
- Différences dans la gestion mémoire entre .NET Framework et .NET Core.
- Comprendre le Garbage Collector : optimisation de la mémoire, génération d’objets.
Travaux pratiques
Créer une application qui alloue et désalloue dynamiquement des objets et surveiller l’utilisation mémoire avec un outil comme dotMemory ou PerfView.
Optimisation des performances
- Allocation de la mémoire, pool d’objets, et structures vs classes.
- Span, Memory et autres optimisations bas-niveau.
Travaux pratiques
Réécrire des méthodes gourmandes en mémoire en utilisant les mécanismes C# pour réduire les allocations temporaires.
Asynchronisme avec async/await
- Meilleures pratiques pour l’utilisation des tâches, gestion d’Exceptions, cancellation tokens.
Travaux pratiques
Refactoriser des méthodes synchrones lourdes pour l'exécuter de manière asynchrone, et mesurer les améliorations.
Multithreading avancé
- Introduction à Task Parallel Library (TPL) , PLINQ , et threads.
Travaux pratiques
Implémenter une application multithreadée qui traite un grand volume de données et comparer les gains en performance avec une version single-thread.
Profiling d’applications
- Outils de diagnostic : dotnet trace, BenchmarkDotNet, dotTrace.
Travaux pratiques
Créer un benchmark d'une application existante avec BenchmarkDotNet pour identifier les goulets d'étranglement.
Optimisation des I/O
- Utilisation d’ Async IO , buffering, pipelines pour améliorer les performances des entrées/sorties.
Travaux pratiques
Optimiser une application qui lit/écrit sur disque ou réseau en implémentant des pipelines d'I/O.
Optimisation base de données
- Côté Base de données (démonstrations):
- Le rôle du moteur SQL Server et son interaction avec C#.
- Les bonnes pratiques en conception de bases de données.
- Comprendre les plans d'exécution et leur analyse.
- Types d'index : cluster, non-cluster, et index covering.
- Quand et comment utiliser les index.
- Impact des index sur les opérations de lecture et d'écriture
- Techniques d'optimisation : index composite, fill factor, fragmentation d'index.
- Côté C# (démonstrations):
- Techniques de minimisation des appels à la base de données : batch processing, pagination.
- Performances liées à la sérialisation / dé sérialisation.
- Utilisation des requêtes paramétrées pour éviter l'injection SQL et améliorer la performance.
- Les transactions dans SQL Server : isolation levels, transactions implicites et explicites.
- Problèmes liés aux verrous (deadlock, lock escalation).
- Optimisation des transactions longues et réduction du temps de verrouillage.
- Ségrégation des queries.
- No SQL dans SQL et avantages performance.
Cas dʼétude / Consolidation des compétences
- Jeux de mise en situation (TP de révision)
- Migration, optimisation mémoire, multithreading, diagnostics.
- Présentation de problèmes.
- Recherche de solutions.