.NET 11의 성능 개선

1 day ago 9

.NET 11은 JIT와 라이브러리 전반에서 불필요한 할당, 경계 검사, 잠금, 복사를 줄임. JIT 최적화는 소스 수정이나 애플리케이션 재컴파일 없이도 이득을 주는 경우가 많음 런타임 비동기(runtime async) 는 async/await 변환을 컴파일러에서 런타임/JIT로 옮겨 중간 Task와 상태 머신 비용을 줄임. 애플리케이션에서는 선택적으로 활성화하며, 일부 경로는 아직 느려질 수 있어 측정이 필요함 경계 검사 제거와 탈출 분석을 확대해 안전한 C# 코드의 성능을 높임. 경계 검사를 피하려고 작성한 Unsafe 기반 코드를 일반 span 코드로 바꿔도 성능을 유지하거나 개선하는 사례가 있음 컬렉션과 LINQ는 입력의 개수, 비교자, 저장 구조를 활용해 중복 작업을 줄임. AsyncEnumerable의 연속 Append 순회는 O(N²)에서 O(N)으로 개선되고, LINQ에 FullJoin이 추가됨 I/O, 네트워킹, JSON, 진단, 암호화에서도 관리 코드의 부가 비용을 줄임. 수치는 특정 마이크로벤치마크 결과이므로 실제 워크로드의 개선 폭으로 일반화할 수 없음 JIT와 라이브러리의 최적화 JIT가 추상화 너머의 정보를 더 오래 보존함 실제 타입을 확인한 가상 호출을 직접 호출로 바꾸고 인라인해 상수 전파, 경계 검사 제거, 임시 객체 할당 제거까지 연결함 nullable 박싱 개선의 FormatNullableInt 예제는 .NET 10의 9.583ns에서 .NET 11의 1.987ns로 줄고, 24B 힙 할당이 사라짐 조건부 탈출 분석 확대로 인스턴스 필드의 읽기 전용 컬렉션을 순회하는 예제는 13.874ns에서 2.674ns로 줄고, 32B 열거자 할당이 제거됨 CoreCLR 델리게이트 레이아웃 변경으로 64비트 프로세스에서 델리게이트당 8B가 줄어듦 런타임 비동기는 작은 비동기 메서드를 여러 계층으로 나누는 비용을 낮춤 런타임/JIT가 중단 지점의 생존 값과 재개 흐름을 분석하며, 직접 연결된 비동기 호출 사이에서는 중간 Task<T>를 만들지 않고 결과나 재개 상태를 전달할 수 있음 .NET 11에서 기존 변환과 비교한 두 계층 호출 예제의 동기 완료는 21.221ns/144B에서 6.151ns/0B로, 실제 중단은 254.139ns/248B에서 116.927ns/168B로 개선됨 비동기 메서드 10개를 연결한 예제의 DLL 크기는 10,752바이트에서 5,632바이트로 줄어듦 읽...

Read Entire Article