2009-05-19 1 views

답변

17

우리는 프로덕션에서 중요한 성능 문제가 있었기 때문에 1 년 전과 같은 질문이있었습니다. MS Premier 지원에서 나에게 설명했듯이 디버그 빌드 버전에는 응용 프로그램의 기능에 따라 메모리 소비가 약 1 - 10 % 증가 할 수있는 디버깅을위한 후크가 포함됩니다.

문제가 없다면 혼자있게하고 메모리 소비에 문제가 있다면 다시 컴파일하고 배포하십시오.

6

제 경험상 30-40 %의 차이를 보았습니다. 이것은 DotNetZip으로, 암호화, 압축 및 파일 I/O를 수행하는 라이브러리입니다. 85 % 이상의 시간이 암호화 및 압축에 사용되어 바이트 만 이동했습니다.

0

디버그 심볼을로드해야하므로 더 많은 메모리를 소비하기 때문에 프로덕션에서 디버그 빌드를 사용하는 것에 대한 또 다른 인수가 있습니다.

1

일반적으로 릴리스 버전은 /optimize 컴파일러 옵션을 사용하여 최적화되어 컴파일되므로 이점이 있습니다. 그러나 차이점이 얼마나 큰지는 특정 어셈블리에 따라 달라집니다. 프로파일 링해야합니다.

1

코드의 복잡성에 따라 성능 차이가 기하 급수적으로 증가한다는 것을 알게되었습니다. 간단한 응용 프로그램은 5 %의 차이 만 보일 수 있지만 복잡한 응용 프로그램 특히 50 %의 성능 저하를 보았습니다. 배열이나 맵과 같은 더 큰 데이터 구조가 필요합니다.

설정 방법에 따라 디버그 코드가 약간 다를 수도 있습니다. 예를 들어 어서션을 살펴보십시오.

#if DEBUG 
... 
#endif 

또한의 Debug.WriteLine, Debug.Assert, 그리고 열고 System.Diagnostics 네임 스페이스에 다른 물건을 제거 할 수 있습니다 :

2

그것은 그 릴리스 코드를 주목할 필요가있다 또한 같은 몇 가지 전처리 물건을 제거 테스트에 유용하지만 릴리스 빌드를 위해 잘 설계된 코드에는 무의미합니다.

4

디버그 및 릴리스 빌드에 대해 생성 된 IL 코드를 보면 일반적으로 차이가 매우 작습니다. 대부분의 차이점은 Edit and Continue와 소스 라인 디버깅을 지원하기 위해 핵심 소스 지점에서 추가 nop 명령에 있습니다. 그러나 .NET 런타임이 실제로 MSIL을 JIT하면 런타임 어셈블리가 거의 동일합니다. 가장 큰 차이점은 디버거가 연결될 때입니다. 그러면 JIT가 실제 실행 코드를 최적화하지 못하게됩니다.

릴리스 버전은 많은 코드가 포함되어 있지 않기 때문에 훨씬 더 작습니다. #if DEBUG 문으로 둘러싸인 코드 패치는 물론 릴리스 모드의 메서드 호출을 생략하도록 컴파일러에 지시하는 조건부 특성 (Debug.WriteLine과 유사 함)이있을 수 있습니다.

Debug.WriteLine 및 Trace.WriteLine 메서드는 프로덕션 코드에 남아있을 때 디버거가 연결되지 않은 경우에도 중요한 성능 관련 내용을 포함하고 있습니다.

관련 문제