대신 최적화 매개 변수를 사용 또는 사용하지 않고 컴파일했는지 여부를 알 수있는 방법이 있습니다. 나는 그것이 릴리스인지 또는 디버그인지를 알기를 원하지 않는다. 내 관점에서 볼 때, 코드가 출시 버전이라고하더라도 실제로 최적화 되었습니까? 감사.C# 어셈블리가 최적화 매개 변수로 컴파일되었는지 확인하는 방법이 있습니까?
답변
확인할 방법 중 하나는 조립품에서 DebuggableAttribute
(doc)을 보는 것입니다. DisableOptimizations
플래그는 C# 컴파일러가/optimize 옵션을 전달한 경우 설정되지 않습니다.
참고 : 대부분의 시나리오에서 작동하지만 이것이 100 % 어리석은 해결책은 아닙니다. 그것은 사용자의 손이 DebuggableAttribute
이는 C# 컴파일러는 을 정의하는 것보다 우선합니다 정의하는 경우 최적화
- 를 나눌 수 있습니다 Ildasm.exe를 가진 어셈블리 매니페스트에서
이 게시물은 http://www.panopticoncentral.net/archive/2004/02/03/267.aspx
특히, ILDASM에서, 당신은 DebuggableAttribute를하고 NOP를의 부재를 찾을 수 있습니다 도움이 될 수 있습니다.
해당 정보는 VB.Net 컴파일러에만 해당됩니다. 그것은 C#과 매우 유사하지만 약간 다른 의미를 가지고 있습니다. – JaredPar
봐 : 릴리스 버전의
// --- The following custom attribute is added automatically, do not uncomment -------
// .custom instance void [mscorlib]System.Diagnostics.DebuggableAttribute::.ctor(
valuetype [mscorlib]System.Diagnostics.DebuggableAttribute/DebuggingModes)
= (01 00 02 00 00 00 00 00)
. 디버그 빌드 값은 (01 00 07 01 00 00 00 00
입니다. 또 다른 주름은 디버거가 JIT 최적화기를 비활성화 할 수 있다는 것입니다. VS, 도구 + 옵션, 디버깅, 일반, "모듈로드에서 JIT 최적화 억제"의 구성 가능한 옵션입니다. 릴리스 빌드를 디버깅하고 비슷한 성능을 원한다면이 기능을 꺼야합니다. 디버깅이 더욱 어려워지고, 옵티 마이저가 다시 정렬되고 코드가 인라인 될 때 스테핑이 이상하게 작동하고 CPU 레지스터에 저장되기 때문에 로컬 변수의 값을 검사 할 수없는 경우가 있습니다.
내가 C#을 "코드 최적화"로 설정하고 디버그에서 다시 빌드하면 참조하는 디버그 값이 계속 표시됩니다. // 다음 사용자 지정 특성이 자동으로 추가되며 ------- // .custom instance void [mscorlib] System.Diagnostics.DebuggableAttribute ::. ctor (valueetype [mscorlib] System .Diagnostics.DebuggableAttribute/DebuggingModes) = (01 00 07 01 00 00 00) – John
방금 VS2012로 다시 확인했습니다. 아니, 아직 내가 설명한 것처럼 작동합니다.옵션을 변경 한 후 다시 빌드하는 것을 잊지 마십시오. –
감사합니다. 귀하의 설명과 일치하는 코드가 최적화되지 않았을 때 위에서 설명한 내용을 얻었지만, 릴리스 모드에서 기본적으로 설정되어 최적화 된 경우 매니페스트의 디버그 특성에 대한 언급이 전혀 없습니다. 네, 위의 제 성문과 상충됩니다, 사과드립니다. 계속 어셈블리를보고 언급 한 빌드 값으로 DebuggableAttribute를 볼 수 있는지 확인합니다. 코드가 최적화되도록 설정된 경우입니다. VS2010입니다. 감사. – John
- 1. .NET 어셈블리가 TRACE 또는 DEBUG 플래그로 컴파일되었는지 확인하는 방법
- 2. Java 주석을 매개 변수로 전달하는 방법이 있습니까?
- 3. 어셈블리가 변경되었는지 확인하는 방법
- 4. 매개 변수로 속성? C#
- 5. C++ 최적화
- 6. 일부 함수 나 연산자를 매개 변수로 전달하는 방법이 있습니까?
- 7. C# SQL 매개 변수로 위로
- 8. C#에서 double이 실수인지 확인하는 방법이 있습니까?
- 9. C# 문자열의 인코딩을 확인하는 방법이 있습니까?
- 10. C++ 매개 변수로 클래스 전달
- 11. C# 매개 변수로 작업을 사용합니다.
- 12. 어셈블리가 VB로 작성되었는지 확인하는 방법
- 13. Javascript에서 객체 배열을 함수 호출에서 매개 변수로 변환하는 방법이 있습니까?
- 14. 일반 객체 매개 변수로 Func을 설정하는 방법이 있습니까?
- 15. 클래스가 java6 용으로 컴파일되었는지 알 수있는 방법이 있습니까?
- 16. 특정 어셈블리가 있는지 확인하는 방법은 무엇입니까?
- 17. 하스켈에서이 프로그램을 최적화 할 수있는 방법이 있습니까?
- 18. C# 4.0 : Optional 매개 변수로 Color를 기본값으로 사용할 수 있습니까?
- 19. C++ : 함수를 다른 함수의 매개 변수로 전달
- 20. ActionScript에서 루프 매개 변수의 값을 확인하는 방법이 있습니까?
- 21. C# 4.0에서 인터페이스/대리인의 차이점을 확인하는 방법이 있습니까?
- 22. 이 코드를 최적화 할 수있는 방법이 있습니까?
- 23. C++에서 템플릿의 매개 변수로 사용하는 변수
- 24. 함수에서 매개 변수로 문자열을
- 25. 함수를 매개 변수로 전달할 수 있습니까?
- 26. 이 C# 코드를 최적화 할 수있는 방법이 있습니까?
- 27. 예외가 발생하는지 확인하는 방법이 있습니까?
- 28. ExternalInterface.call의 출처를 확인하는 방법이 있습니까?
- 29. C# 정적 변수를 DeploymentItem의 매개 변수로 사용합니다.
- 30. C# : 제네릭 매개 변수로 "self"유형을 사용합니까?
1. 문제는 C# 어셈블리에 관한 것이기 때문에 문제는 아니지만 2. 여전히 유효합니다 (사용자가 속성을 무시하면 런타임 최적화가 제거되어 어셈블리가 최적화되지 않은 것으로 생각 되나요?) – Zaki
@Zaki 예/아니요. JIT 최적화가 비활성화되지만 다른 C# 컴파일러 최적화는 활성화되지 않습니다. – JaredPar
/optimize ==/optimize- –