Loupe

.NET Core 2.1

.Net Core 2.1 arrive bientôt (95% complete - .NET Core 2.1, next major release) : une preview est supposée être disponible au premier trimestre 2018 avec une disponibilité générale en second trimestre (voir la roadmap).

Attention il ne faut pas confondre .Net Core 2.1 et .NET Core SDK 2.1.2. Ce dernier est un SDK qui inclut .NET Core 2.0.3 Runtime et n'est pas lié à .Net Core 2.1. Vous avez le droit de trouver ça déroutant.

Après la génèse confuse de .Net Core 2.0 (on peut se rappeler du revirement avec le project.json qui est encore responsable d'un support des différents outils pour le moins perfectible), les maîtres mots de la version 2.1 sont consolidation et efficacité.

.Net Core 2.1

  • Spans/Memory, récement introduits en C# 7.2, vont être généralisés (on peut se référer à la présentation technique d'Adam Sitnik dans .NET Core: Performance Storm ou la série de vidéos d'Immo Landwerth: vidéo 1, vidéo 2 and  vidéo 3). Le but principal étant de réduire les allocations mémoire en heap :
    • en limitant les allocations inutiles (pourquoi allouer une nouvelle string qui contient sa propre copie des données pour lire les données du header d'une requête http alors que le header complet est déjà en mémoire?),
    • en limitant les conversions de format de string (web est principalement encodé en utf8 alors que .Net est Unicode). Par contre la classe Utf8String n'est pas supposée être disponible en 2.1,
    • en utilisant préférentiellement les algo sans allocation.
  • Utilisation tous azimuts des Span/Memory. Dans Add initial Span/Buffer-based APIs across corefx, on peut effectivement voir qu'ils débarquent un peu partout dans la BCL :
      • System.BitConverter
      • System.Convert
      • System.Random
      • Primitive Parse methods
      • System.Guid
      • System.String
      • System.IO.Stream
      • System.IO.BufferStream and System.IO.ReadOnlyBufferStream
      • System.IO.TextReader and System.IO.TextWriter
      • System.IO.BinaryReader and System.IO.BinaryWriter
      • System.IO.File
      • System.Text.StringBuilder
      • System.Text.Encoding
      • System.Numerics
      • System.Net.IPAddress
      • System.Net.Sockets
      • System.Net.WebSockets.WebSocket
      • System.Net.Http
      • System.Security.Cryptography
  • Intégration de Microsoft.Windows.Compatibility (Ship .NET Framework compatibility pack). Pour une description détaillée de Microsoft.Windows.Compatibility, on pourra se référer à l'annonce MSDN du Windows Compatibility Pack for .NET Core.
  • Amélioration de la lisibilité de la Stacktrace comme démontré par l'équipe de Age of Ascent.
  • La possibilité de customiser le garbage collector (si le GC est moins mis à contribution, il devient possible d'utiliser des algorithmes qui retardent les libérations mémoire pour les rendre plus efficaces). Même si nous savions déjà que c'était faisable depuis l'été dernier, des nouvelles récentes nous montrent que cette customisation du garbage collector Garbage va devenir standard en 2.1. Cela rend possible l'apparition d'implémentation spécifiques (pourquoi pas Open SOurce). Pour l'instant, la seule customisation est  une démonstration d'un zéro GC (absence de toute libération). Un peu théorique mais c'est un début.

Asp.Net Core 2.1

  • ManagedHandler : une nouvelle implémentation managée de la stack http qui viendra en remplacement de WinHTTP sous Windows et libcurl sous Unix/OSX. Une version managée devient possible avec le gain d'efficacité que permettent les Spans/Memory.
  • HttpClientFactory (révélé par l'excellent post de Steve Gordon part 1 et part 2) permet de gérer le lifetime des instances de la classe HttpClient de manière à maximiser la réutilisation de socket tout en évitant le piège de l'instance statique qui se trouve incapable de gérer les changements d'adresses DNS.
  • Une nouvelle version de SignalR (bien que le 2.1 milestone soit loin d'être prêt) avec :

EF Core 2.1

EF Core continue à récupérer les fonctionnalitées qui lui font défaut (la roadmap est ici):

  • Support du GroupBy,
  • Support du chargement Lazy des relations,
  • Un meilleur support des transactions,
  • SqlGeometry, SqlGeography,
  • Un provider CosmoDB (qui devrait être encore en preview lors de la sortie de Core 2.1),
  • Un support amélioré du monitoring AppInsight.

Conclusion temporaire

Toutes ces améliorations/innovations font de cette version une release majeure en matière de fonctionnalités et de recherche de la performance même si la numérotation 2.1 me semble tout à fait justifiée. La compatibilité avec la 2.0 devrait être au rendez-vous et la prise en compte des améliorations se fera en plusieurs phases :

  • nos programmes bénéficieront automatiquement d'une partie des améliorations,
  • Il faudra ensuite que les librairies de l'écosystème se mettent à jour. Je pense, par exemple, aux différents parseurs (dont Json.Net), aux drivers de base de données,
  • Il faudra finalement modifier nos pratiques pour utiliser les nouveaux composants (par exemple, utiliser les spans en remplacement des arrays).

.Net core 2.1 a tout pour péréniser les espoirs de la 2.0. C'est à nous d'en faire une version historique. 

Ces billets pourraient aussi vous intéresser

Vous nous direz ?!

Commentaires

comments powered by Disqus