2 puntos por GN⁺ 2024-10-20 | 1 comentarios | Compartir por WhatsApp

Mejoras de rendimiento de LINQ en .NET 9.0

  • Iteración con Span<T>

    • En .NET 9.0, el rendimiento de LINQ ha mejorado considerablemente.
    • Al iterar arreglos usando Span<T>, el rendimiento mejora.
    • El método TryGetSpan() convierte arreglos o listas en ReadOnlySpan<T> para aumentar la velocidad de iteración.
  • Método TryGetSpan()

    • TryGetSpan() mejora el rendimiento de iteración al convertir arreglos o listas en ReadOnlySpan<T>.
    • La optimización del código se realiza en detalles minuciosos, y es código escrito por expertos en rendimiento.
    • Como el arreglo interno de una lista puede cambiar, hay que tener cuidado al usar CollectionsMarshal.AsSpan().
  • Llamadores de TryGetSpan()

    • Al analizar los métodos que llaman a TryGetSpan(), se observa que muchos métodos de Enumerable intentan usar spans cuando se trata de arreglos o listas.
    • Las operaciones que usan yield no pueden aprovechar esta optimización.
  • Iteradores especializados

    • Se mejoró el rendimiento al unificar las clases de iteradores basadas en las interfaces internas IIListProvider e IPartition de LINQ.
    • Se generan iteradores especializados que reconocen ciertas cadenas de llamadas de LINQ y las procesan de forma eficiente.
  • Implementación de Iterator<T> y clases derivadas

    • Iterator<T> es una clase abstracta, y las clases derivadas solo sobrescriben los métodos necesarios.
    • ListWhereSelectIterator<TSource, TResult> mejora el rendimiento al procesar la cadena Where(...).Select(...) con un solo iterador.
  • Caso de estudio de IListSkipTakeIterator<TSource>

    • El método MoveNext() evita iteraciones innecesarias y solo procesa los elementos dentro del rango de _minIndexInclusive y _maxIndexInclusive.

Resumen de GN⁺

  • En .NET 9.0, el rendimiento de LINQ ha mejorado notablemente, especialmente al usar Span<T> y TryGetSpan() para acelerar la iteración.
  • La estructura interna de LINQ fue optimizada para reconocer ciertas cadenas de llamadas y generar iteradores especializados que las procesan eficientemente.
  • Estas mejoras ayudan a aumentar el rendimiento del código, y migrar a una versión reciente de .NET permite aprovechar estos beneficios.
  • Otra biblioteca que ofrece funcionalidades similares a LINQ es System.Linq.Async.

1 comentarios

 
GN⁺ 2024-10-20
Opiniones en Hacker News
  • La parte más útil de LINQ es su extensión de IEnumerable. Esto permite escribir C# con un estilo funcional

    • Después de aprender Haskell, se entendió el concepto de LINQ
    • Si lo usa un equipo sin experiencia, puede terminar en código complejo y lento
  • No se entiende por qué el equipo de dotnet no invierte más recursos en las herramientas

    • Se menciona la necesidad de generación de documentación, mejores pruebas unitarias y mejor accesibilidad al código fuente
    • A la mayoría de los paquetes de NuGet les falta documentación
  • Las mejoras de rendimiento de LINQ están centradas en mejorar el rendimiento de la implementación propia de List<T> de Microsoft

    • Se enfatiza la necesidad de invertir en la reducción de asignaciones de lambdas y del tiempo de compilación
    • Se menciona la necesidad de soporte de comodines para variables de LINQ
  • LINQ es uno de los principales factores de diferenciación entre lenguajes

    • Casi no ha cambiado desde C# 3
    • Es una pena pensar que LINQ solo sirve para iterar listas
  • Cuanto más tome C# de F#, más satisfactorio resulta

    • Se espera que las uniones discriminadas lleguen a C#
  • Al usar otros lenguajes, se extraña LINQ

    • Tener LINQ en la biblioteca estándar es una gran ventaja
  • Una vez que se empieza a usar LINQ, se vuelve difícil usar otra cosa

  • Es difícil encontrar materiales integrales para aprender desarrollo web con dotnet

    • La mayoría de los materiales son demasiado básicos o de baja calidad
  • Las anotaciones en el código moderno de .NET son demasiado complejas

    • Se necesita una mejor manera
  • Hay una sección sobre mejoras de rendimiento en .NET 9

    • Se menciona que se pueden hacer más optimizaciones en cadenas que terminan en métodos específicos
  • OrderBy(criteria).First() podría optimizarse a Min(criteria)

    • Es positivo que la biblioteca reconozca y corrija patrones ineficientes