런타임 .Net 성능에 도움이 되는 속성은 무엇입니까?
-
09-06-2019 - |
문제
로더, JIT 컴파일러 또는 ngen에 힌트를 제공하여 .Net 애플리케이션에 대한 최상의 런타임 성능을 보장하는 데 사용할 수 있는 속성을 찾고 있습니다.
예를 들어 우리는 Debuggable속성 최적의 성능을 위해 디버그하지 않고 최적화를 비활성화하지 않도록 설정해야 합니다.
[Debuggable(false, false)]
제가 알아야 할 다른 사람이 있나요?
해결책
Ecma-335는 Annex F "부정확한 오류"에서 완화된 예외 처리(소위 e-relaxed 호출)를 위해 몇 가지 CompilationRelaxations를 더 지정하지만 Microsoft에서는 이를 공개하지 않았습니다.
특히 CompilationRelaxations.RelaxedArrayExceptions 및 CompilationRelaxations.RelaxedNullReferenceException이 언급되어 있습니다.
CompilationRelaxationsAttribute의 ctor에서 일부 정수를 시도할 때 무슨 일이 일어나는지 흥미로울 것입니다.)
다른 팁
그리고 또 다른:리터럴 문자열(소스 코드에 선언된 문자열)은 기본적으로 인턴 메모리를 절약하기 위해 풀에 넣습니다.
string s1 = "MyTest";
string s2 = new StringBuilder().Append("My").Append("Test").ToString();
string s3 = String.Intern(s2);
Console.WriteLine((Object)s2==(Object)s1); // Different references.
Console.WriteLine((Object)s3==(Object)s1); // The same reference.
동일한 리터럴 문자열을 여러 번 사용하면 메모리가 절약되지만 풀을 유지하는 데 약간의 CPU가 필요하며 문자열이 풀에 들어가면 프로세스가 중지될 때까지 풀에 유지됩니다.
사용 CompilationRelaxationsAttribute 모든 리터럴 문자열을 인턴하는 것을 원하지 않는다고 JIT 컴파일러에 알릴 수 있습니다.
[assembly: CompilationRelaxations(CompilationRelaxations.NoStringInterning)]
다른 것을 찾았습니다: NeutralResourcesLanguageAttribute.에 따르면 이것 블로그 게시물에서는 현재(중립) 어셈블리인 경우 문화권을 지정하여 로더가 올바른 위성 어셈블리를 더 빠르게 찾는 데 도움이 됩니다.
[NeutralResourcesLanguageAttribute("nl", UltimateResourceFallbackLocation.MainAssembly)]