2 points par GN⁺ 2024-10-20 | 1 commentaires | Partager sur WhatsApp

Améliorations des performances de LINQ dans .NET 9.0

  • Itération avec Span<T>

    • Les performances de LINQ ont été considérablement améliorées dans .NET 9.0.
    • L’itération sur des tableaux avec Span<T> améliore les performances.
    • La méthode TryGetSpan() convertit un tableau ou une liste en ReadOnlySpan<T> afin d’accélérer l’itération.
  • Méthode TryGetSpan()

    • TryGetSpan() améliore les performances d’itération en convertissant un tableau ou une liste en ReadOnlySpan<T>.
    • L’optimisation du code se fait dans des détails très fins, et ce code a été écrit par des experts en performance.
    • Comme le tableau interne d’une liste peut être modifié, l’utilisation de CollectionsMarshal.AsSpan() nécessite de la prudence.
  • Appelants de TryGetSpan()

    • En analysant les méthodes qui appellent TryGetSpan(), on constate que de nombreuses méthodes de Enumerable tentent d’utiliser un span lorsqu’elles reçoivent un tableau ou une liste.
    • Les opérations qui utilisent yield ne peuvent pas bénéficier de cette optimisation.
  • Itérateurs spécialisés

    • Les performances ont été améliorées en unifiant les classes d’itérateurs basées sur les interfaces internes IIListProvider et IPartition de LINQ.
    • Des itérateurs spécialisés sont générés pour reconnaître certaines chaînes d’appels LINQ et les traiter efficacement.
  • Implémentation de Iterator<T> et des classes dérivées

    • Iterator<T> est une classe abstraite, et les classes dérivées ne redéfinissent que les méthodes nécessaires.
    • ListWhereSelectIterator<TSource, TResult> traite la chaîne Where(...).Select(...) avec un seul itérateur afin d’améliorer les performances.
  • Étude de cas : IListSkipTakeIterator<TSource>

    • La méthode MoveNext() évite les itérations inutiles et ne traite que les éléments compris dans la plage _minIndexInclusive à _maxIndexInclusive.

Résumé GN⁺

  • Dans .NET 9.0, les performances de LINQ ont été nettement améliorées, notamment grâce à Span<T> et TryGetSpan() pour accélérer l’itération.
  • La structure interne de LINQ a été optimisée afin de générer des itérateurs spécialisés capables de reconnaître certaines chaînes d’appels et de les traiter efficacement.
  • Ces améliorations contribuent à de meilleures performances du code, et migrer vers une version récente de .NET permet d’en tirer parti.
  • System.Linq.Async fait partie des autres bibliothèques proposant des fonctionnalités similaires à LINQ.

1 commentaires

 
GN⁺ 2024-10-20
Commentaires Hacker News
  • La partie la plus utile de LINQ est son extension d’IEnumerable. Elle permet d’écrire du C# dans un style fonctionnel

    • Après avoir appris Haskell, le concept de LINQ est devenu clair
    • Lorsqu’il est utilisé par une équipe inexpérimentée, cela peut produire un code complexe et lent
  • Il est difficile de comprendre pourquoi l’équipe dotnet n’investit pas davantage de ressources dans les outils

    • Mention du besoin de génération de documentation, de meilleurs tests unitaires et d’une meilleure accessibilité du code source
    • La plupart des packages sur NuGet manquent de documentation
  • Les améliorations de performances de LINQ se concentrent sur les performances de l’implémentation interne de List<T> de Microsoft

    • Insistance sur la nécessité d’investir dans la réduction des allocations de lambdas et du temps de compilation
    • Mention du besoin d’un support des jokers pour les variables LINQ
  • LINQ est l’un des principaux éléments de différenciation entre les langages

    • Il n’a presque pas changé depuis C# 3
    • C’est dommage de penser que LINQ n’est utile que pour l’itération sur des listes
  • Plus C# emprunte à F#, plus c’est satisfaisant

    • Espoir de voir les unions discriminées être introduites dans C#
  • LINQ manque lorsqu’on utilise d’autres langages

    • Avoir LINQ dans la bibliothèque standard est un grand avantage
  • Une fois qu’on commence à utiliser LINQ, il devient difficile d’utiliser autre chose

  • Il est difficile de trouver des ressources d’apprentissage complètes sur le développement web en dotnet

    • La plupart des ressources sont soit trop basiques, soit de mauvaise qualité
  • Les annotations du code .NET moderne sont trop complexes

    • Il faut une meilleure approche
  • Il existe une section sur les améliorations de performances dans .NET 9

    • Mention de possibilités d’optimisation supplémentaires dans les chaînes se terminant par certaines méthodes
  • OrderBy(criteria).First() peut être optimisé en Min(criteria)

    • Il est positif que la bibliothèque reconnaisse et corrige les schémas inefficaces