Améliorations des performances de LINQ dans .NET 9.0
(blog.ndepend.com)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 enReadOnlySpan<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 enReadOnlySpan<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 deEnumerabletentent d’utiliser un span lorsqu’elles reçoivent un tableau ou une liste. - Les opérations qui utilisent
yieldne peuvent pas bénéficier de cette optimisation.
- En analysant les méthodes qui appellent
-
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
IIListProvideretIPartitionde 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.
- Les performances ont été améliorées en unifiant les classes d’itérateurs basées sur les interfaces internes
-
Implémentation de
Iterator<T>et des classes dérivéesIterator<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îneWhere(...).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.
- La méthode
Résumé GN⁺
- Dans .NET 9.0, les performances de LINQ ont été nettement améliorées, notamment grâce à
Span<T>etTryGetSpan()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.Asyncfait partie des autres bibliothèques proposant des fonctionnalités similaires à LINQ.
1 commentaires
Commentaires Hacker News
La partie la plus utile de LINQ est son extension d’
IEnumerable. Elle permet d’écrire du C# dans un style fonctionnelIl est difficile de comprendre pourquoi l’équipe dotnet n’investit pas davantage de ressources dans les outils
Les améliorations de performances de LINQ se concentrent sur les performances de l’implémentation interne de
List<T>de MicrosoftLINQ est l’un des principaux éléments de différenciation entre les langages
Plus C# emprunte à F#, plus c’est satisfaisant
LINQ manque lorsqu’on utilise d’autres langages
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
Les annotations du code .NET moderne sont trop complexes
Il existe une section sur les améliorations de performances dans .NET 9
OrderBy(criteria).First()peut être optimisé enMin(criteria)