Home .NET 8 변경점
Post
Cancel

.NET 8 변경점

.NET 8 변경점

.NET 8 변경사항 에서 관심있는 부분 정리.


[제네릭] GetEnumerator 개선

foreach 같은 구문에서 사용하는 제네릭의 GetEnumerator()가 개선되었다.

기존 코드는 다음과 같이 별다른 조건체크 없이 매번 열거자를 새로 생성하도록 되어있다.

1
2
3
4
IEnumerator<T> IEnumerable<T>.GetEnumerator() 
{ 
    return new Enumerator(this);
}

제네릭이 비어있는 경우에는 새로 생성할 필요가 없으므로 static Enumerator를 반환하도록 개선되었다. T[] 는 이미 적용하고 있는 방법인데 제네릭으로 확장한 것.

내부 구현 은 count 체크후에 전역 객체를 반환하는 식으로 간단하게 되어있다.

비어있는 List<T> 를 예시로 .NET 7 에서 8로 넘어가면서 15.9046 ns => 0.8954 ns 만큼 속도가 개선되었다.


[제네릭] ICollection를 구현하지 않은 객체의 AddRange 개선

ICollection이 구현된 객체는 AddRange 시에 객체의 Count를 확인하고 적절하게 메모리를 확보하여 Insert 하도록 최적화가 되어있다.

여기서, ICollection 구현이 안된 객체들에 대한 별도 처리가 없어서 AddRange 호출 시에 불필요한 중복 검사 등이 포함되어있던 부분을 없애고 코드도 인라인처리하여 속도를 개선하였다.

ICollection이 구현이 안된 IEnumerable<T> 를 예시로 .NET 7에서 8로 넘어가면서 6.365 us => 2.445 us 만큼 속도가 개선되었다.


[LINQ] ToList() 개선

기존 ToList() 에서는 새 list를 만든 후 List<T>.Add 함수를 사용하여 객체를 채워 반환하였는데.

.NET 8에서는 Span<T>.Fill (ref struct 로 구현되어 배열을 감싸 view를 제공하는 타입)을 대신 사용하여 속도를 개선하였다.

.NET 7에서 8로 넘어가면서

Select().ToList()2,627.8 ns => 1,096.6 ns Repeat().ToList()1,543.2 ns => 106.1 ns Range().ToList()2,908.9 ns => 865.2 ns

만큼 속도가 개선되었다.

This post is licensed under CC BY 4.0 by the author.

.NET GC 정리(2)

GC DATAS (Dynamic Adaptation To Application Sizes, 동적 힙 갯수 조절)