Windows 10 또는 .NET Framework 4.7.1로 업그레이드한 후 System.Diagnostics.StackFrame 클래스를 사용하는 .NET Framework 애플리케이션을 실행할 때 성능이 눈에 띄게 저하된다면, 이 글이 도움이 될 것입니다. 이번 글에서는 해당 문제의 원인을 살펴보고, 알려진 해결 방법을 소개합니다.
System.Diagnostics.StackFrame 성능 저하 현상
.NET Framework 4.7 이하 버전에서는 정상적인 성능을 보이던 애플리케이션이 .NET Framework 4.7.1 환경에서는 더 느리게 동작합니다. 애플리케이션은 일반적으로 .NET 예외가 발생할 때 StackFrame에 의존합니다. 예외가 높은 빈도로 발생하면(초당 10회 이상), 애플리케이션 속도가 크게 느려질 수 있으며(최대 10배까지), 이전보다 확연히 느리게 실행됩니다.
성능 저하의 원인
Windows 10에 포함된 .NET Framework 4.7.1에는 스택 추적(stack trace)에 파일 및 줄 번호 정보를 표시하기 위해 Portable PDB 파일 형식을 감지하고 구문 분석하는 기능이 추가되었습니다. 이 변경 사항의 일부로, 스택 추적 내 각 함수는 해당 모듈이 Portable PDB 형식을 사용하는지 확인하기 위해 자신을 정의한 모듈을 검사하게 됩니다. 그런데 내부 캐싱 정책의 일부 차이로 인해, 런타임이 Portable PDB를 검색하는 데 이전 .NET Framework 버전이 기존 Windows PDB를 검색하던 시간보다 훨씬 많은 시간을 소모하게 되었습니다.
그 결과 형식화된 스택 추적이 이전보다 느리게 생성됩니다.
이 문제는 발생하는 예외의 수 자체를 변화시키지는 않습니다. 다만, 애플리케이션이 해당 예외를 처리하는 능력을 크게 저하시킵니다.
특히 IKVM 라이브러리를 사용하는 애플리케이션은 어셈블리 프로빙(probing) 과정에서 이 문제의 영향을 받는 것으로 알려져 있습니다. 어셈블리 프로빙은 예외를 유발하는 것으로 잘 알려져 있기 때문입니다.
System.Diagnostics.StackFrame 성능 저하 문제 해결 방법
이 문제를 해결하기 위해 Microsoft는 다음 두 가지 방법 중 하나를 사용할 것을 권장합니다.
1] Boolean 인수를 받는 다른 StackFrame 생성자 사용
이것이 가장 권장되는 해결책입니다.
애플리케이션 개발자가 코드를 수정할 수 있는 경우, System.Diagnostics.StackTrace.#ctor(Boolean) 생성자를 false 인수와 함께 호출하여 소스 정보 캡처를 피하세요. 이렇게 하면 성능이 저하되는 코드 경로를 우회할 수 있습니다.
2] 이전 버전으로 롤백하거나 최신 Windows 10 버전으로 업그레이드
현재 최신 버전의 Windows 10을 사용하지 않고 있다면, 이전 버전/빌드로 롤백하거나 최신 버전/빌드로 업그레이드하세요. 또한 컴퓨터에 .NET Framework 4.7.1이 설치되어 있다면 이를 제거한 후, 이전 버전 또는 최신 버전의 .NET Framework를 다운로드하여 설치하시기 바랍니다.
이 글이 도움이 되기를 바랍니다!