Leistungsverbesserungen von LINQ in .NET 9.0
(blog.ndepend.com)Leistungsverbesserungen von LINQ in .NET 9.0
-
Iteration mit
Span<T>- In .NET 9.0 wurde die Leistung von LINQ deutlich verbessert.
- Die Iteration über Arrays mit
Span<T>verbessert die Performance. - Mit der Methode
TryGetSpan()werden Arrays oder Listen inReadOnlySpan<T>umgewandelt, um die Iterationsgeschwindigkeit zu erhöhen.
-
Methode
TryGetSpan()TryGetSpan()verbessert die Iterationsleistung, indem Arrays oder Listen inReadOnlySpan<T>umgewandelt werden.- Die Code-Optimierung findet in kleinen Details statt, und der Code wurde von Performance-Experten geschrieben.
- Da sich das interne Array einer Liste ändern kann, ist bei der Verwendung von
CollectionsMarshal.AsSpan()Vorsicht geboten.
-
Aufrufer von
TryGetSpan()- Durch die Analyse der Methoden, die
TryGetSpan()aufrufen, zeigt sich, dass vieleEnumerable-Methoden versuchen, bei Arrays oder Listen Spans zu verwenden. - Operationen, die
yieldverwenden, können diese Optimierung nicht nutzen.
- Durch die Analyse der Methoden, die
-
Spezialisierte Iteratoren
- Zur Leistungssteigerung wurden die auf den internen LINQ-Schnittstellen
IIListProviderundIPartitionbasierenden Iterator-Klassen zusammengeführt. - Es werden spezialisierte Iteratoren erzeugt, die bestimmte LINQ-Aufrufketten erkennen und effizient verarbeiten.
- Zur Leistungssteigerung wurden die auf den internen LINQ-Schnittstellen
-
Implementierung von
Iterator<T>und abgeleiteten KlassenIterator<T>ist eine abstrakte Klasse, und abgeleitete Klassen überschreiben nur die jeweils benötigten Methoden.ListWhereSelectIterator<TSource, TResult>verarbeitet die KetteWhere(...).Select(...)in einem einzigen Iterator und verbessert dadurch die Performance.
-
Fallstudie:
IListSkipTakeIterator<TSource>- Die Methode
MoveNext()vermeidet unnötige Iterationen und verarbeitet nur Elemente im Bereich_minIndexInclusivebis_maxIndexInclusive.
- Die Methode
Zusammenfassung von GN⁺
- In .NET 9.0 wurde die Leistung von LINQ deutlich verbessert, insbesondere durch die Verwendung von
Span<T>undTryGetSpan()zur Beschleunigung der Iteration. - Die interne Struktur von LINQ wurde optimiert, sodass spezialisierte Iteratoren erzeugt werden, die bestimmte Aufrufketten erkennen und effizient verarbeiten.
- Diese Verbesserungen helfen dabei, die Code-Performance zu steigern, und durch eine Migration auf die neueste .NET-Version lassen sich diese Vorteile nutzen.
- Eine weitere Bibliothek mit LINQ-ähnlicher Funktionalität ist
System.Linq.Async.
1 Kommentare
Hacker-News-Kommentare
Der nützlichste Teil von LINQ sind die
IEnumerable-Erweiterungen. Sie ermöglichen es, C# in einem funktionalen Stil zu schreiben.Ich kann nicht verstehen, warum das dotnet-Team nicht mehr Ressourcen in die Tooling investiert.
Die Performance-Verbesserungen bei LINQ konzentrieren sich auf Verbesserungen der Performance von Microsofts eigener
List<T>-Implementierung.LINQ ist eines der wichtigsten Unterscheidungsmerkmale zwischen Programmiersprachen.
Je mehr C# aus F# übernimmt, desto zufriedener bin ich.
Wenn ich andere Sprachen benutze, vermisse ich LINQ.
Wenn man einmal anfängt, LINQ zu benutzen, ist es schwer, etwas anderes zu verwenden.
Es ist schwer, umfassende Lernmaterialien für die Webentwicklung mit dotnet zu finden.
Die Annotationen in modernem .NET-Code sind zu kompliziert.
Es gibt einen Abschnitt zu Performance-Verbesserungen in .NET 9.
OrderBy(criteria).First()kann zuMin(criteria)optimiert werden.