수성컴전자방입니다.
Visual Studio로 빌드(Ctrl+F5)할 때 Debug 모드와 Release 모드 중 하나를 선택할 수 있습니다. 기본값이 Debug라서 초보 개발자는 Release 모드가 따로 있는 줄 모르기가 쉽습니다. 개발 중에는 Debug를, 배포할 때는 Release를 사용하시면 됩니다. 그런데 이 둘은 어떻게 다른 것일까요? 오늘은 C++ 예제 코드를 이용하여 Debug와 Release가 어떻게 다른지 비교해 보겠습니다.
목차
1. 실행 속도
2. 빌드 결과물(.exe) 저장 위치
3. Step Into(F11)
4. 초기화하지 않은 변수 처리
5. 메모리 사용량
6. Runtime Library
7. Incremental Linking(증분 링크)
8. 글 마무리
9. 참고 자료
1. 실행 속도
#include <iostream>
#include <chrono>
#include <vector>
using namespace std;
int main()
{
vector<int> v;
//시작 시간 측정
auto start = chrono::high_resolution_clock::now();
//vector에 0~99999를 push
for (int i = 0; i < 100000; ++i) {
v.push_back(i);
}
//종료 시간 측정
auto stop = chrono::high_resolution_clock::now();
//경과 시간 계산, 출력
auto duration = chrono::duration_cast<chrono::microseconds>(stop - start);
cout << "소요 시간: " << duration.count() << "ms" << endl;
return 0;
}
vector push 100000회 소요 시간: Debug 7824ms > Release 656ms
Release 모드가 더 빠릅니다. 그러니 프로그램을 배포할 때는 Release 모드로 빌드해야겠죠?
2. 빌드 결과물(.exe) 저장 위치
64-bit로 빌드한 경우 프로젝트 폴더로 들어가시면 x64 폴더가 있습니다.
Debug 모드로 빌드 시 프로젝트경로\x64\Debug 안에, Release 모드로 빌드 시 프로젝트경로\x64\Release 안에 빌드 결과물이 있습니다.
빌드를 진행한 모드에 따라 Debug 또는 Release 폴더로 들어가시면 프로젝트명.exe 파일이 있는 것을 보실 수 있을 것입니다.
3. Step Into(F11)
줄번호 왼쪽을 클릭해서 breakpoint(중단점)를 설정하고 F5를 눌러 디버깅해 보겠습니다.
Debug 모드에서는 디버깅 중에 Step Into(F11)를 해도 직접 작성한 소스코드만 탐색합니다.
Release 모드에서는 디버깅 중에 Step Into(F11)를 하다 보면 직접 작성하지 않고 include한 표준 라이브러리(ostream, vector 등)까지 탐색합니다.
4. 초기화하지 않은 변수 처리
#include <iostream>
using namespace std;
int main()
{
int num[10];
int* ptr[10];
for (int i = 0; i < 10; ++i) {
cout << "num[" << i << "]=" << num[i] << endl;
}
for (int i = 0; i < 10; ++i) {
cout << "ptr[" << i << "]=" << ptr[i] << endl;
}
return 0;
}
7~8행을 보시면 변수들이 초기화되지 않은 것을 보실 수 있습니다. 원래 초기화되지 않는 변수들에는 쓰레기 값이 들어가게 됩니다. 7행의 num[0]~num[9]는 그냥 int형 변수들(엄밀히 말하면 길이가 10인 배열이지만…)이라서 그냥 쓰레기 값 출력하고 끝이겠지만, 8행의 ptr[0]~ptr[9]는 int형 포인터라서 잘못 참조하면 시스템에 오류가 생길 수도 있죠.
그래서 Debug 모드로 빌드하면 컴파일러가 알아서 모든 바이트를 \(\text{CC}_{16}=11001100_2\)으로 초기화해 줍니다.
- int형 변수: \(\text{CCCCCCCC}_{16}=-858993460_{10}\)
- 포인터 변수(64-bit 환경에서): \(\text{CCCCCCCCCCCCCCCC}_{16}\)
반면 Release 모드에서는 원래 C/C++의 특징에 맞게 직접 초기화하지 않은 변수들에 쓰레기 값이 저장되어 있습니다.
5. 메모리 사용량
Debug > Release
Release 모드가 Debug 모드보다 메모리를 적게 사용합니다.
6. Runtime Library
Visual Studio 창 오른쪽 Solution Explorer에서 프로젝트 이름을 오른쪽 클릭한 다음 Properties를 클릭합니다.
Property Pages(속성 페이지) 창 왼쪽 위를 보면 Configuration 펼침 메뉴가 있어서 Active(현재 빌드 모드), Debug, Release 등을 선택할 수 있습니다. 그리고 왼쪽 Configuration Properties(구성 속성)→C/C++→Code Generation(코드 생성)으로 들어가시면 Runtime Library를 확인하실 수 있습니다.
Debug의 Runtime Library는 Multi-thread Debug DLL (/MDd)입니다.
Release의 Runtime Library는 Multi-thread DLL (/MD)입니다.
7. Incremental Linking(증분 링크)
5번 문단에서 들어간 Property Pages 창을 계속해서 보겠습니다. 왼쪽 Configuration Properties(구성 속성)→Linker→General(일반)으로 들어가시면 Enable Incremental Linking(증분 링크 사용) 여부를 확인하실 수 있습니다.
Debug의 Enable Incremental Linking에는 Yes (/INCREMENTAL)라고 적혀 있습니다.
Release의 Enable Incremental Linking에는 아무것도 적혀 있지 않습니다. 꺼져 있다는 뜻이겠지요.
8. 글 마무리
평소에 개발할 때에는 여러 편리한 기능이 있는 Debug 모드로 빌드하다가 배포하실 때에는 실행 속도가 빠른 Release 모드로 빌드하면 될 것 같습니다.
제 글을 읽어 주셔서 감사합니다. 다음에 만나요!
9. 참고 자료
1) ShovelingLife. 2023. “Debug - Release 차이”, A Game Programmer. (2024. 01. 04. 방문). https://devshovelinglife.tistory.com/744
2) CodeOKim. 2023. “[Visual Studio 기본] Debug, Release 모드 차이점”, MyCodeStory. (2024. 01. 04. 방문). https://mcl-ing1130.tistory.com/2
3) Mister_Q. 2013. “STL Debug 모드 에서 속도 난감할때..”, Mi_Q Kingdom. (2024. 01. 04. 방문). https://goguri.tistory.com/entry/STL-Debug-%EB%AA%A8%EB%93%9C-%EC%97%90%EC%84%9C-%EC%86%8D%EB%8F%84-%EB%82%9C%EA%B0%90%ED%95%A0%EB%95%8C
4) ssoyxon. 2023. “[C++] <chrono> 헤더 사용하여 함수 실행시간 측정”, 소연의_개발일지. (2024. 01. 04. 방문). https://giveme-happyending.tistory.com/221
5) 소프트웨어엔지니어. 2023. “[C++] 함수 실행 시간 측정 방법 - chrono 총정리 duration_cast system_clock getTickCount”, SWEngineer. (2024. 01. 04. 방문). https://swengineer.tistory.com/46
6) 코딩하는상후니. 2022. “#36. 2차원배열 &다중포인터”, 상후니의 개발 블로그. (2024. 01. 04. 방문). https://sanghoon23.tistory.com/40