.NET의 디버그 대 릴리스
이전 질문에 이어 C # 애플리케이션, 특히 웹 애플리케이션에서 디버그 및 릴리스 모드간에 사용 가능한 모든 차이점을 나열하는 포괄적 인 문서가 있습니까?
어떤 차이점이 있습니까?
"Debug"및 "Release"는 Visual Studio에서 정의한 미리 정의 된 프로젝트 구성의 이름 일뿐입니다.
차이점을 확인하려면 Visual Studio의 프로젝트 속성에서 빌드 탭을 확인하세요.
VS2005의 차이점은 다음과 같습니다.
디버그 구성에 정의 된 DEBUG 상수
릴리스 구성에서 활성화 된 코드 최적화
"고급"버튼을 클릭하여 확인할 수있는 기타 차이점
하지만 당신은 할 수 있습니다:
프로젝트 속성 / 빌드에서 디버그 및 릴리스 구성에 대한 빌드 설정 변경
솔루션 탐색기에서 솔루션을 마우스 오른쪽 단추로 클릭하고 구성 관리자를 선택하여 사용자 지정 구성을 만듭니다.
DEBUG 상수의 동작은 상당히 명확하다고 생각합니다 (#if 전 처리기 지시문 또는 ConditionalAttribute에서 참조 할 수 있음). 하지만 정확히 어떤 최적화가 활성화되어 있는지에 대한 포괄적 인 문서를 알지 못합니다. 사실 Microsoft가 사전 통지없이 최적화 프로그램을 향상시킬 수 있기를 원할 것입니다.
차이점을 나열하는 문서가 하나도 없습니다. 이미 나열된 몇 가지 차이점 외에도 디버그 모드에서 컴파일하면 런타임에 수행되는 대부분의 JIT 컴파일러 최적화가 해제되고 심볼 데이터베이스 파일 (.pdb)에 더 완전한 디버그 정보가 방출됩니다.
또 다른 큰 차이점은 JIT 컴파일러가 디버깅 세션을 지원하기 위해 적절하거나 필요 에 따라 GC.KeepAlive () 호출을 삽입한다는 점에서 GC 동작이 다소 다르다는 것 입니다.
간결한 문서 하나는 모르지만 다음과 같습니다.
- Debug.Write 호출은 릴리스에서 제거됩니다.
- 릴리스에서는 Scott Hanselman이 설명한대로 최적화로 인해 CallStack이 약간 "이상하게"보일 수 있습니다.
디버그 및 릴리스는 다양한 솔루션 구성에 대한 레이블 일뿐입니다. 원하는 경우 다른 사용자를 추가 할 수 있습니다. 원하는 경우 구성 관리자에서 더 많은 구성을 추가 할 수 있습니다.
http://msdn.microsoft.com/en-us/library/kwybya3w.aspx
주요 차이점 –
1. 디버그 dll에는 Visual Studio의 모든 소스 코드 줄에 중단 점을 설정할 수 있도록 몇 가지 추가 지침이 추가되었습니다. 또한 코드를 디버깅 할 수 있도록 코드가 최적화되지 않습니다. 릴리스 버전에서는 이러한 추가 지침이 제거됩니다.
2. PDB 파일은 관련 모드가 아닌 디버그 모드에서만 생성됩니다.
3. 릴리스 모드에서 cpde는 JIT 컴파일러에 내장 된 최적화 프로그램에 의해 최적화됩니다. 다음과 같은 최적화를 수행합니다.
• 메서드 인라인-메서드 호출은 메서드의 코드를 삽입하는 것으로 대체됩니다.
• CPU 레지스터 할당-로컬 변수 및 메서드 인수는 스택 프레임에 다시 저장되지 않고 (또는 덜 자주) CPU 레지스터에 계속 저장 될 수 있습니다.
• 배열 인덱스 검사 제거-배열 작업시 중요한 최적화입니다 (모든 .NET 컬렉션 클래스는 내부적으로 배열을 사용합니다). JIT 컴파일러가 루프가 범위를 벗어난 배열을 인덱싱하지 않는지 확인할 수 있으면 인덱스 검사를 제거합니다.
• Loop unrolling - Short loops (up to 4) with small bodies are eliminated by repeating the code in the loop body.
• Dead code elimination - A statement like if (false) { /.../ } gets completely eliminated.
• Code hoisting- Code inside a loop that is not affected by the loop can be moved out of the loop.
• Common sub-expression elimination. x = y + 4; z = y + 4; becomes z = x
ASP.NET Ajax 컨트롤 중 하나를 사용하는 경우 주요 성능 영역 중 하나는 릴리스에서 실행될 때 JavaScript 라이브러리에서 디버그 정보가 제거되고 복잡한 페이지에서 주요 성능 향상을 보았습니다. 다른 웹 기반 리소스는이 설정에 따라 캐시되거나 캐시되지 않을 수 있습니다.
또한 웹 애플리케이션의 디버그 / 릴리스는 web.config
Visual Studio 내의 설정이 아니라 파일 에 의해 결정된다는 점을 기억 하십시오.
<system.web>
<compilation debug="true">
추가 정보:
Drawing with GDI+ is considerably slower in Debug mode.
You can also manage some part of code that you want to run only in debug or only in release with preprocessor markups:
#if DEBUG
// Some code running only in debug
#endif
or
#if NOT DEBUG
// Some code running only in release
#endif
Release version:
is considerable faster (most important), optimized
can't be debuged (step by step)
and code written in "debug" directive is not included
See What's the difference between a Debug vs Release Build?.
I got an error message when I distribute executable file to another machine indicating that the system missed MSVCP110D.dll.
The solution to this issue is stated in Stack Overflow question Visual Studio MSVCP110D.dll is missing.
IN XXXXD.dll D means that the DLL file is a debug version of the DLL file. But MS Visual C++ Redistributable packages include only the release version of DLL files.
That means if you need to distribute a program developed by Visual C++ you need to build it in Release mode. And also you need to install MS Visual C++ Redistributable (correct version) on the target machine.
So I think this a one of key difference between debug and release mode.
ReferenceURL : https://stackoverflow.com/questions/90871/debug-vs-release-in-net
'developer tip' 카테고리의 다른 글
cURL 오류 (7) 해결 방법 : 호스트에 연결할 수 없습니까? (0) | 2021.01.08 |
---|---|
로거에 대한 핸들러를 찾을 수 없습니다. (0) | 2021.01.07 |
Rails Migration (MySQL)에서 새 열의 위치를 지정할 수 있습니까? (0) | 2021.01.07 |
Joda-Time을 사용하여 주어진 달의 일수를 어떻게 얻습니까? (0) | 2021.01.07 |
자바에서 큰 따옴표 이스케이프 (0) | 2021.01.07 |