반응형

C/C++의 빌드 모드


C/C++의 Debug 및 Release 빌드 모드의 의미와 차이, 각 모드별 장단점에 대해서 알아보고, 추가로 성능 측정을 통해 실제 환경에서 비교해보자.

 

보통 C++로 코드 작성 후 결과물을 실행 파일로 만들기 위해서는 빌드 작업을 해야만 한다.

 

이때 Visual Studio와 같은 IDE에서는 Debug 또는 Release 빌드 모드를 선택할 수 있다.

이는 사실 C/C++ 컴파일러의 최적화 옵션의 차이인데, Visual Studio에서는 편의를 위해 빌드 모드를 분리해놓은 것이다.

 

Visual Studio의 빌드 모드 선택 항목

현업에 종사하거나 숙련된 개발자는 당연히 이 차이를 알고 있겠지만,

주로 C/C++ 개발을 처음 접하는 분들, 특히 학생들은 Visual Studio 기본값인 'Debug'로 빌드해서 배포를 하는 경우가 종종 있다.

 

잘못된 빌드 모드로 배포할 경우 성능 저하가 발생하거나 프로그램 실행 불가 등의 문제로 상당히 고생할 수 있다.

그러므로 각 빌드별 특징을 잘 알고있어야 한다.

728x90

 

Debug vs Release 차이점


그럼 Debug 모드와 Release 모드 빌드는 어떤 차이점이 있을까?

 

일단 이름에서도 알 수 있듯,

Debug 모드는 디버깅에 적합한 빌드이며,

Release 모드는 배포를 적합한 빌드이다.

 

빌드 구성의 세부 속성에 따라 일부 차이가 있을 순 있겠지만,

대체로 두 빌드에 대한 차이점을 요약하면 다음과 같다.

Debug Release
  • 코드 최적화 하지 않음
  • 바이너리(실행 파일) 크기가 크다.
  • 코드 실행 속도가 느림
  • 메모리 사용량이 많음
  • 바이너리에 디버깅에 필요한 정보가 포함됨
  • 컴파일 속도 빠름
  • 코드 최적화 과정 수행
  • 바이너리 크기가 작다.
  • 코드 실행 속도 빠름
  • 메모리 사용량이 적음
  • 디버깅에 필요한 정보가 거의 포함되지 않음
  • 컴파일 속도 느림 (최적화 과정이 포함되므로)

물론 코드 실행 결과는 동일하다.

 

각각의 빌드 모드는 언제 사용해야할까?

 

Debug 빌드는 코드 실행 속도가 느리지만, 디버깅이 용이하고 컴파일 속도도 빠르므로

한창 개발이 진행중인 프로젝트에서 개발자가 디버깅을 할때 사용하는 것을 권장한다.

 

Release 빌드는 코드 실행 속도가 빠르고 배포하기도 용이하므로 (VC++ 재배포 패키지) 개발이 완료되고,

실제 사용자에게 전달할 때 사용하는 것을 권장한다.

 

그러나 Release 빌드에서도 Debug 빌드에서 확인되지 않은 문제점이 발견되므로

Release 빌드에서의 테스트도 필수라고 할 수 있다.

 

Debug vs Release 성능 비교


그럼 Debug 빌드와 Release 빌드에서 성능 차이는 얼마나 발생하는 것일까?

 

간단한 테스트를 통해 각 빌드의 코드 실행 속도와 메모리 사용량을 비교해보자.

다음 테스트 결과가 모든 케이스를 대표하지는 못하겠지만, 참고용으로 활용할 수는 있겠다.

 

테스트는 '소수 구하기'이다.

#include <iostream>
#include <vector>
#include <Windows.h>

bool isPrime(int x)
{
    if (x <= 1)
    {
        return false;
    }

    for (int i = 2; i < sqrt(x); ++i)
    {
        if (x % i == 0)
        {
            return false;
        }
    }

    return true;
}

int main()
{
    int n;
    std::vector<int> vec;
    LARGE_INTEGER st, ed, freq;

    std::cout << "소수 개수 : ";
    std::cin >> n;

    QueryPerformanceFrequency(&freq);
    QueryPerformanceCounter(&st); // 측정 시작

    for (int i = 0; vec.size() < n; ++i)
    {
        if (isPrime(i))
        {
            vec.push_back(i);
        }
    }

    QueryPerformanceCounter(&ed); // 측정 완료

    std::cout << "소요 시간 : " << (double)(ed.QuadPart - st.QuadPart) / ((double)freq.QuadPart);
    system("pause");

    return 0;
}

100,000개의 소수를 구하는 방식으로 Debug, Release 빌드 각각 테스트하여 비교해볼 것이다.

 

빌드 환경

  • Windows 10 19H2 x64
  • Visual Studio 2019
  • Debug x86(/MDd /Od), Release x86(/MD /GL /O2 /Oi)

 

1. 실행 파일 크기 비교

Debug와 Release 모드로 빌드한 실행파일의 크기 비교

  • Debug  - 71.5KB (73,216 바이트)
  • Release - 15.0KB (15,360 바이트)

=> 약 4.7배 차이

 

2. 실행 속도 비교 (100,000개, 3회 평균)

Debug와 Release 모드로 빌드에 따른 실행 속도 비교

  • Debug  - 3.02014초
  • Release - 0.24319초

=> 약 12.4배 차이

 

3. 메모리 사용량

Debug와 Release 모드로 빌드에 따른 메모리 사용량 비교

  • Debug  - 1,000KB
  • Release - 844KB

=> 약 15%(156KB) 차이

    (단, 실행 파일의 크기가 커질수록 오차가 발생할 것이다.)


Debug 빌드와 Release 빌드 모드의 의미와 차이, 각 모드별 장단점에 대해서 살펴보았다.

각 빌드의 성능 측정 결과, 실행 파일 크기는 4.7배, 실행 속도는 12.4배, 메모리 사용량은 15% 정도 차이가 발생했다.

 

실제로 성능을 측정하여 비교해본 건 처음인데,

이번 케이스에서는 예상보다도 많은 차이를 보이는 것 같다.

 

위 내용을 참고해서 Debug와 Release 빌드를 적절히 활용하길 바란다.

반응형

+ Recent posts