2 Punkte von GN⁺ 2024-10-20 | 1 Kommentare | Auf WhatsApp teilen

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 in ReadOnlySpan<T> umgewandelt, um die Iterationsgeschwindigkeit zu erhöhen.
  • Methode TryGetSpan()

    • TryGetSpan() verbessert die Iterationsleistung, indem Arrays oder Listen in ReadOnlySpan<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 viele Enumerable-Methoden versuchen, bei Arrays oder Listen Spans zu verwenden.
    • Operationen, die yield verwenden, können diese Optimierung nicht nutzen.
  • Spezialisierte Iteratoren

    • Zur Leistungssteigerung wurden die auf den internen LINQ-Schnittstellen IIListProvider und IPartition basierenden Iterator-Klassen zusammengeführt.
    • Es werden spezialisierte Iteratoren erzeugt, die bestimmte LINQ-Aufrufketten erkennen und effizient verarbeiten.
  • Implementierung von Iterator<T> und abgeleiteten Klassen

    • Iterator<T> ist eine abstrakte Klasse, und abgeleitete Klassen überschreiben nur die jeweils benötigten Methoden.
    • ListWhereSelectIterator<TSource, TResult> verarbeitet die Kette Where(...).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 _minIndexInclusive bis _maxIndexInclusive.

Zusammenfassung von GN⁺

  • In .NET 9.0 wurde die Leistung von LINQ deutlich verbessert, insbesondere durch die Verwendung von Span<T> und TryGetSpan() 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

 
GN⁺ 2024-10-20
Hacker-News-Kommentare
  • Der nützlichste Teil von LINQ sind die IEnumerable-Erweiterungen. Sie ermöglichen es, C# in einem funktionalen Stil zu schreiben.

    • Nachdem ich Haskell gelernt hatte, verstand ich das Konzept von LINQ.
    • Wenn Teams ohne Erfahrung es verwenden, kann daraus komplexer und langsamer Code entstehen.
  • Ich kann nicht verstehen, warum das dotnet-Team nicht mehr Ressourcen in die Tooling investiert.

    • Es wird auf die Notwendigkeit von Dokumentationsgenerierung, besseren Unit-Tests und einer besseren Zugänglichkeit des Source Codes hingewiesen.
    • Den meisten Paketen auf NuGet fehlt Dokumentation.
  • Die Performance-Verbesserungen bei LINQ konzentrieren sich auf Verbesserungen der Performance von Microsofts eigener List<T>-Implementierung.

    • Es wird betont, dass in Lambda-Allokationen und kürzere Compile-Zeiten investiert werden sollte.
    • Es wird erwähnt, dass Wildcard-Unterstützung für LINQ-Variablen nötig ist.
  • LINQ ist eines der wichtigsten Unterscheidungsmerkmale zwischen Programmiersprachen.

    • Seit C# 3 hat sich daran kaum etwas geändert.
    • Es ist bedauerlich, wenn man denkt, dass LINQ nur für die Iteration über Listen nützlich ist.
  • Je mehr C# aus F# übernimmt, desto zufriedener bin ich.

    • Ich hoffe, dass discriminated unions in C# eingeführt werden.
  • Wenn ich andere Sprachen benutze, vermisse ich LINQ.

    • LINQ in der Standardbibliothek zu haben, ist ein großer Vorteil.
  • 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 meisten Materialien sind entweder zu einsteigerhaft oder von geringer Qualität.
  • Die Annotationen in modernem .NET-Code sind zu kompliziert.

    • Es braucht einen besseren Weg.
  • Es gibt einen Abschnitt zu Performance-Verbesserungen in .NET 9.

    • Es wird erwähnt, dass bei Chains, die mit bestimmten Methoden enden, weitere Optimierungen möglich sind.
  • OrderBy(criteria).First() kann zu Min(criteria) optimiert werden.

    • Es ist positiv, wenn die Bibliothek ineffiziente Muster erkennt und korrigiert.