C++ TIPS

Visual Studio 컴파일 속도 올리기

hyrule 2022. 9. 22. 23:14

 

우리는 이를 여러 개의 헤더 파일과 cpp 파일로 분리하여 클래스 형태로 쪼개서 프로그래밍한다. 순차적 프로그래밍으로 main.cpp에 모든 코드를 떄려박는 것은 가독성이나, 코드 유지보수 면에서 매우 비효율적이기 때문이다.

하지만 이런 식으로 프로그래밍을 할 경우 컴파일 때 문제가 생긴다. 순차적 프로그래밍에서는 이것저것 확인할 필요 없이 코드 순서대로 컴파일을 해나가면 되지만, 객체 지향 프로그래밍에서는 한 클래스에서 이것저것 참조하는 데이터가 생기므로 여기저기 왔다갔다 하면서 컴파일해야 하기 때문이다. 사람의 가독성은 올라갔지만 컴파일 시의 가독성은 떨어졌다고 볼 수 있겠다.

당연히 이건 프로그램이 빌드되는 걸 지루하게 기다리는 나에게만 해당되는 내용이 아니었다. 많은 개발자들이 컴파일 속도를 올리기 위해 많은 기능을 만들어 두었다.

 

 

1. Multi Processor Compile

말 그대로 ‘멀티프로세서’를 사용해서 컴파일하는 것이다.

기본값은 미사용이며, 싱글코어만 갈궈서 컴파일한다. 특정 언어나 기능은 멀티프로세서 컴파일을 지원하지 않으므로 호환성 때문에 꺼져 있는 것이라고 한다.

 

빌드하려는 프로젝트 -

프로젝트 - 속성 - 구성 속성 - C/C++ - 다중 프로세서 컴파일’

항목을

‘예(/MP)’

로 설정해 주면 된다.

 

단순히 켜져 있는 것만으로도 엄청난 속도 상승 효과를 볼 수 있다.

 

  • 기본값(싱글코어)
    한 번에 하나씩 처리

 


 

 

2. Unity Build

** Unity Engine과는 관련 없음 **

위의 내용처럼, 컴파일 타임이 늘어나는 이유 중 하나는

코드가 분리되어서

이다.

그렇다면, 코드를 한 군데에 전부 때려박은 뒤에 일괄적으로 컴파일하는 것은 어떨까?

이에 착안해서 만들어진 기능이 Unity(또는 JUMBO) 빌드이다.

 

일단 한번 기능을 켠 뒤 빌드해보자.

기능은 ‘프로젝트 - 속성 - 구성 속성 - 고급 - Unity(JUMBO) 빌드 사용’ 항목을 ‘예’로 바꾸어 주면 된다.

 

 

 

기능을 활성화 한 뒤 빌드하면, 이런 파일들이 출력 창에 뜨는 것을 볼 수가 있다.

빌드 시작... 1>------ 빌드 시작: 프로젝트: Engine, 구성: Debug x64 ------ 1>unity_Q1GMDEAB0G0HT7DQ.cpp 1>unity_GSPE9LEGSD2UEU3Z.cpp 1>unity_9740IRMYM6P77B93.cpp 1>unity_2SV5QYZL38YGS3Q3.cpp 1>unity_8LF15BE9Z3F9YPP7.cpp 1>unity_JPV4PBTRJP0KNH6D.cpp 1>unity_KB4PPMDQB0WIRJAB.cpp 1>unity_QVK6M8063WBPYFEY.cpp 1>unity_45EQHKW831YKEH19.cpp 1>unity_SDCMT5DZWLP2R0XX.cpp 1>unity_D5AGYYELO6T5PLU0.cpp 1>unity_3AFCH92IEAWLW9JZ.cpp 1>unity_LKPYTLQ40A3JIQ7S.cpp 1>unity_KAOVZ8R4LZI4WES5.cpp 1>unity_Y8BSKPU22E3KBD9C.cpp 1>unity_RTVCUEM9VW6ILVU7.cpp
  • 이 파일들은 기본적으로 ‘프로젝트 - 속성 - 구성 속성 - 일반’ 의 ‘중간 디렉터리’ 위치에 생성된다.


  •  
  • 생성된 .cpp 파일을 아무거나 골라서 열어보자.

 

 

 

#include "C:\Users\abcd\source\repos\Project\Engine\Include\a.cpp" #include "C:\Users\abcd\source\repos\Project\Engine\Include\b.cpp" #include "C:\Users\abcd\source\repos\Project\Engine\Include\c.cpp" #include "C:\Users\abcd\source\repos\Project\Engine\Include\d.cpp"

→ 이런 식으로 프로젝트에서 사용하는 .cpp 파일들에 대한

절대 경로

가 포함되어있는 것을 확인할 수 있다.

include 전처리기의 실제 기능은 포함시킨 파일 안에 있는 내용을 복사 붙여넣기 해 주는 것이므로, 해당 작업은 a.cpp, b.cpp, c.cpp, d.cpp 파일을 복사해다가 한 파일 안에 붙여넣기 한 것일 뿐이지만,실제로 컴파일해 보면 엄청난 속도 상승을 체감할 수 있다.

 

cf) 1번의 MP 옵션 + 2번의 Unity옵션을 같이 사용 시 이 Unity.cpp의 갯수를 자신이 사용하는 CPU의 ‘스레드’ 수만큼 나누어서 각 코어에 할당하므로 시너지를 기대할 수 있다.

지금 사용하는 컴퓨터는 ‘8코어 16스레드’ 이므로 컴파일 시 16개의 파일로 분할되어 컴파일하는 것을 알 수 있다.

 

 

💡
속도 비교
  • 기존

 

 

 


Uploaded by

N2T