2010-08-06 7 views
12

디버그 빌드와 릴리스 빌드간에 Windows 서비스 이득을 얻을 수있는 정도와 그 이유는 무엇입니까?C# 디버그 대 릴리스

+0

누군가가 제공 할 수있는 벤치 마크 측정 기준에 잘 부합 할 수있는 훌륭한 질문입니다. – kbrimington

+0

[C# debug vs release performance] 가능한 복제본 (http://stackoverflow.com/questions/2446027/c-debug-vs-release-performance) –

답변

6

관리 코드의 경우 DEBUG 빌드를 위해 조건부로 컴파일 된 항목이 많지 않은 한 IL은 거의 동일해야합니다. IL은 거의 동일해야합니다. 지터는 디버거에서 실행될 때와 다르게 생성됩니다. IL에 대한 컴파일은별로 영향을받지 않습니다.

일리노이로 컴파일 할 때 /optimize이 수행하는 몇 가지 사항이 있지만 특히 공격적인 것은 아닙니다. 이러한 IL 최적화 중 일부는 IL에서 최적화되지 않은 경우에도 (지터 제거와 같이) 지터 최적화에 의해 처리됩니다. 자세한 내용은

참조 에릭 Lippert의 기사 http://blogs.msdn.com/ericlippert/archive/2009/06/11/what-does-the-optimize-switch-do.aspx는 :

해당/최적화 플래그는 우리의 발광 및 생성 로직의 엄청난 금액을 변경하지 않습니다. 우리는 항상 직접적이고 검증 가능한 코드를 생성 한 다음 실제 기계 코드를 생성 할 때 최적화 작업을 수행하는 데 지터를 사용합니다. 그러나 우리는 플래그를 설정하여 간단한 최적화 작업을 수행 할 것입니다.

/optimize에 대한 자세한 내용은 Eric의 기사를 참조하십시오.

+0

좋은 정보 ... 보안은 어떻습니까? 디버그 정보로 출하/노출하면 검사 결과 코드에 대해 더 많은 정보가 공개됩니까? 비록 성능면에서 무시할 수있는 차이가있다하더라도, 내가하지 않으면 디버그 코드를 제공하지 않을 것입니다. –

+1

@Edward : DEBUG 빌드를 배포하는 것을 정말로 권유하고있는 것은 아니며, 단지 DEBUG와 RELEASE 빌드 간의 성능 차이가 크지 않을 것이라고 말합니다.또한 디버그 빌드가 어셈블리 자체에 더 자세한 정보를 가지고 있다고 생각하지 않습니다. 디버그 정보는 배포 할 필요가없는 .pdb 파일에 저장됩니다. .NET 어셈블리는 일반적으로 꽤 쉽게 분해/디 컴파일됩니다 (Reflector 도구 참조). 리버스 엔지니어링에 관심이 있다면, 그걸 돕기위한 난독 화 도구가 있지만, 나는 그것에 대해 아무 것도 모릅니다. –

+1

감사합니다 ... 디버그 정보가있는 .pdb를 잊어 버렸습니다. 대부분의 난독 화 도구는 완전한 증거가 아니며 잠재적으로 비용이 많이 듭니다. 나는 항상 누군가가 정말로 원한다면 그들이 들어가기를 항상 가정한다. 나는 혁신에 더 많은 시간을 투자하고 보호해야하는 시간을 줄여야한다. –

1

글쎄, 질문은 중복이지만 원래 질문에서 더 나은 답변이 맨 아래에 있다고 느낍니다. 개인적으로 디버그 모드와 릴리스 모드간에 상당한 차이가있는 상황을 보았습니다. (예 : Property performance, 디버그 모드와 릴리스 모드에서 속성에 액세스하는 데 2 ​​배의 차이가있는 경우). 이 차이가 실제 소프트웨어 (프로그램과 같은 벤치 마크 대신)에 존재하는지 여부는 논쟁의 여지가 있지만, 제가 작업 한 한 제품에서 이러한 차이가 발생하는 것을 보았습니다. msdn social에서 원래의 질문에 닐의 대답에서

는 :

그것은 잘 문서화되어 있지 않습니다

, 여기에 내가 무엇을 알고. 컴파일러는 System.Diagnostics.DebuggableAttribute의 인스턴스를 내 보냅니다. 디버그 버전에서 IsJitOptimizerEnabled 속성은 True이고, 릴리스 버전에서는 False입니다. ildasm.exe를 사용하여 어셈블리 매니페스트에서이 특성을 볼 수 있습니다.

JIT 컴파일러는이 속성을 사용하여 디버깅을 어렵게 만드는 최적화를 비활성화합니다. 루프 - 불변의 호이 스팅과 같이 코드를 움직이는 것들. 선택한 경우 성능면에서 큰 차이를 만들 수 있습니다. 보통은 아니지만.

실행 주소에 중단 점을 매핑하는 것은 디버거의 작업입니다. .pdb 파일과 JIT 컴파일러에 의해 생성 된 정보를 사용하여 IL 명령어를 코드 주소 매핑에 제공합니다. 자체 디버거를 작성하려면 ICorDebugCode :: GetILToNativeMapping()을 사용하십시오.

관련 문제