# Net 9.0 LINQ 성능 개선 사항

> Clean Markdown view of GeekNews topic #17327. Use the original source for factual precision when an external source URL is present.

## Metadata

- GeekNews HTML: [https://news.hada.io/topic?id=17327](https://news.hada.io/topic?id=17327)
- GeekNews Markdown: [https://news.hada.io/topic/17327.md](https://news.hada.io/topic/17327.md)
- Type: GN+
- Author: [neo](https://news.hada.io/@neo)
- Published: 2024-10-20T09:59:44+09:00
- Updated: 2024-10-20T09:59:44+09:00
- Original source: [blog.ndepend.com](https://blog.ndepend.com/net-9-0-linq-performance-improvements/)
- Points: 2
- Comments: 1

## Topic Body

##### .NET 9.0 LINQ 성능 개선

- **Span&lt;T&gt; 사용한 반복**
  - .NET 9.0에서 LINQ의 성능이 크게 개선되었음.
  - `Span&lt;T&gt;`를 사용하여 배열을 반복하면 성능이 향상됨.
  - `TryGetSpan()` 메서드를 사용하여 배열이나 리스트를 `ReadOnlySpan&lt;T&gt;`로 변환하여 반복 속도를 높임.

- **TryGetSpan() 메서드**
  - `TryGetSpan()`은 배열이나 리스트를 `ReadOnlySpan&lt;T&gt;`로 변환하여 반복 성능을 개선함.
  - 코드 최적화는 미세한 부분에서 이루어지며, 성능 전문가들이 작성한 코드임.
  - 리스트의 내부 배열이 변경될 수 있어 `CollectionsMarshal.AsSpan()` 사용 시 주의가 필요함.

- **TryGetSpan() 호출자**
  - `TryGetSpan()`을 호출하는 메서드를 분석하여, 많은 `Enumerable` 메서드가 배열이나 리스트일 때 스팬을 사용하려고 시도함.
  - `yield`를 사용하는 연산은 이 최적화를 사용할 수 없음.

- **특수화된 반복자**
  - LINQ의 내부 `IIListProvider`와 `IPartition`을 기반 반복자 클래스로 통합하여 성능을 개선함.
  - 특정 LINQ 호출 체인을 인식하여 효율적으로 처리하는 특수 반복자를 생성함.

- **Iterator&lt;T&gt;와 파생 클래스 구현**
  - `Iterator&lt;T&gt;`는 추상 클래스이며, 파생 클래스는 필요한 메서드만 재정의함.
  - `ListWhereSelectIterator<TSource, TResult>`는 `Where(...).Select(...)` 체인을 단일 반복자로 처리하여 성능을 개선함.

- **IListSkipTakeIterator&lt;TSource&gt; 사례 연구**
  - `MoveNext()` 메서드는 불필요한 반복을 피하고, `_minIndexInclusive`와 `_maxIndexInclusive` 범위 내의 요소만 처리함.

#### GN⁺의 정리

- .NET 9.0에서 LINQ의 성능이 크게 개선되었으며, 특히 `Span&lt;T&gt;`와 `TryGetSpan()`을 사용하여 반복 성능을 높임.
- LINQ의 내부 구조가 최적화되어, 특정 호출 체인을 인식하고 효율적으로 처리하는 특수 반복자를 생성함.
- 이러한 개선은 코드의 성능을 높이는 데 도움이 되며, 최신 .NET 버전으로 마이그레이션하여 이러한 이점을 누릴 수 있음.
- LINQ와 유사한 기능을 제공하는 다른 라이브러리로는 `System.Linq.Async`가 있음.

## Comments



### Comment 30206

- Author: neo
- Created: 2024-10-20T09:59:44+09:00
- Points: 1

###### [Hacker News 의견](https://news.ycombinator.com/item?id=41878095) 
- LINQ의 가장 유용한 부분은 IEnumerable 확장임. 이는 C#을 함수형 스타일로 작성할 수 있게 해줌
  - Haskell을 배우고 나서 LINQ의 개념이 이해되었음
  - 경험이 없는 팀이 사용할 경우 복잡하고 느린 코드가 될 수 있음

- dotnet 팀이 도구에 더 많은 자원을 투자하지 않는 이유를 이해할 수 없음
  - 문서 생성, 더 나은 유닛 테스트, 소스 코드 접근성 개선 필요성 언급
  - NuGet의 대부분의 패키지에 문서가 부족함

- LINQ 성능 개선은 Microsoft의 자체 List&lt;T&gt; 구현 성능 개선에 집중되어 있음
  - 람다 할당과 컴파일 시간 감소에 투자 필요성 강조
  - LINQ 변수에 와일드카드 지원 필요성 언급

- LINQ는 언어 간의 주요 차별화 요소 중 하나임
  - C# 3 이후로 거의 변화가 없었음
  - LINQ가 리스트 반복에만 유용하다고 생각하는 것은 아쉬운 일임

- C#이 F#에서 더 많은 것을 차용할수록 만족스러움
  - 차별화된 유니온이 C#에 도입되기를 기대함

- 다른 언어를 사용할 때 LINQ가 그리움
  - 표준 라이브러리에 LINQ가 있는 것은 큰 장점임

- LINQ를 사용하기 시작하면 다른 것을 사용하기 어려워짐

- 종합적인 dotnet 웹 개발 학습 자료를 찾기 어려움
  - 대부분의 자료가 초보적이거나 품질이 낮음

- 현대적인 Net 코드의 주석이 너무 복잡함
  - 더 나은 방법이 필요함

- .NET 9의 성능 개선 관련 섹션이 있음
  - 특정 메서드로 끝나는 체인에서 더 많은 최적화 가능성 언급

- OrderBy(criteria).First()가 Min(criteria)로 최적화될 수 있음
  - 라이브러리가 비효율적인 패턴을 인식하고 수정하는 것은 긍정적임
