Microsoft annonce des améliorations de performance dans .Net Core 2.0
après une réécriture des composants du runtime et des bibliothèques de base

Depuis la sortie de .Net Core, l’équipe de Microsoft et les contributeurs du projet open source n’ont de cesse d’apporter des améliorations à ce Framework. Et il y a quelques jours, Microsoft a annoncé une série d’améliorations au niveau des performances de .Net Core 2.0.

Pour les personnes extérieures à l’environnement .Net, il faut savoir que .Net Core se présente comme un assemblage modulaire de composants initialement disponibles dans le Framework .Net. Il sert à créer des applications et des services qui fonctionnent à la fois sur Windows, Linux et Mac. Il a été rendu disponible et open source en 2014 et depuis mars dernier, ses outils pour Visual Studio sont disponibles en version 1.0.

Selon Stephen Toub, travailleur chez Microsoft, un des aspects les plus importants dans .Net Core est la performance. Les développeurs qui utilisent les outils .Net Core sont également d’avis avec Toub et confirment que les performances avec .Net Core sont d’une importance capitale dans la bonne exécution de leurs applications multiplateformes. L’équipe Microsoft en charge du projet et les contributeurs extérieurs ont donc travaillé dans ce sens et ont pu apporter plusieurs améliorations au niveau des performances de l’environnement d’exécution ainsi que les bibliothèques de base de .Net Core 2.0.

Avec les collections par exemple, Microsoft annonce des améliorations significatives au niveau des performances d’un facteur deux pour certaines opérations et pour d’autres encore ces performances sont encore meilleures. En utilisant la classe générique Queue<T>, ainsi que les méthodes Enqueue et Dequeue, nous avons par exemple de meilleures performances avec .Net Core 2.0 comparé à l’usage de cette classe avec le Framework .Net 4.7. Cela a été possible en délestant cette classe de certaines opérations, ce qui a eu pour effet de réduire les coûts de traitement des opérations. Dans d’autres cas, les performances des opérations ont été augmentées en appliquant une refonte de la complexité de l’algorithme des opérations. En exécutant le code ci-dessous avec le Framework .Net, nous avons un rendu après environ 7,7 secondes. Mais avec .Net Core, ce temps tombe à environ 0,013 seconde, donnant ainsi une amélioration estimée à environ 600 fois par rapport au Framework .Net 4.7.

Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
using System;
using System.Diagnostics;
using System.Collections.Generic;
using System.Linq;
 
public class Test
{
    public static void Main()
    {
        var sw = Stopwatch.StartNew();
        var ss = new SortedSet<int>(Enumerable.Repeat(42, 400_000));
        Console.WriteLine(sw.Elapsed);
    }
}
En dehors de la classe Queue<T>, plusieurs autres classes dont les classes SortedSet<T>, List<T>, ConcurrentBag<T>, ConcurrentQueue<T> ou encore ConcurrentBag<T> ont été réécrites pour .NET Core 2.0 et offrent désormais de meilleures performances que les mêmes classes exécutées sur .Net 4.7.

En plus des collections qui ont connu des améliorations de performance, LINQ, le composant du Framework .Net qui permet d’interroger les données des applications .Net en utilisant une syntaxe plus ou moins similaire à SQL a également été réécrit afin d’afficher de meilleures performances avec .Net Core 2.0. Pour cela, ce composant a été débarrassé de plusieurs fonctionnalités superflues.

Par exemple, si vous imbriquez des opérations de concaténation, plus vous devez appeler des énumérateurs et plus l’opération prend du temps pour s’exécuter, d’autant plus que chacune de ces opérations implique plusieurs appels d’interface (MoveNext et Current). Pour régler cela, un opérateur de concaténation spécial a été introduit afin d’éviter la baisse de régime liée à la récursivité des opérations. Cela a permis d’améliorer le temps d’exécution de ces opérations avec .Net Core 2.0. Plusieurs autres optimisations ont été effectuées au niveau des méthodes, appels d’interface, et bien d’autres choses afin d’accroître les performances de LINQ.

Du côté de la manipulation des données dans la mémoire, nous avons également des améliorations de performance qui peuvent désormais être ressenties. Un des points améliorés à ce niveau est la compression et la décompression des données. Dans .NET 4.7, la bibliothèque de compression native zlib est utilisée pour compresser les données. Mais pour décompresser les données, une implémentation non optimisée est utilisée. Dans .Net Core 2.0, une amélioration a été apportée et permet d’utiliser soit Zlib ou soit une implémentation optimisée pour la décompression, ce qui permet d’avoir de meilleures performances au niveau de la décompression.

Au-delà de ces fonctionnalités qui ont connu des gains de performance avec les nouvelles implémentations dans .Net Core 2.0, nous avons également des améliorations au niveau de la cryptographie, des opérations mathématiques, de la sérialisation au format binaire, du traitement de texte, du système de fichiers, du réseau et bien d’autres choses encore qui permettent à .Net Core 2.0 d’afficher de meilleures performances par rapport au Framework .Net 4.7. Toutefois, Microsoft précise que ces performances pourraient varier d’un utilisateur à l’autre dans la mesure où elles ont été obtenues avec une configuration précise.

Source : Blog Microsoft

Et vous ?

Avez-vous effectué des tests avec les composants améliorés ?

Avez-vous observé de meilleures performances de .Net Core 2.0 par rapport au Framework .Net 4.7 comme cela a été annoncé ?

Voir aussi

Microsoft dévoile la feuille de route de .NET Core, l'entreprise compte apporter des concepts de programmation fonctionnelle aux langages .NET
Microsoft annonce la disponibilité générale de .NET Core 1.0 et ASP.NET Core 1.0 pour Windows, OS X et Linux