2012-05-18 5 views
5

Visual Studio 2005에서는 릴리스 용으로 빌드하는 데 약 2 분이 걸리지 만 디버그 용으로 빌드하는 데 약 6 분이 소요되는 단일 라이브러리 w/195cpp 파일이 있습니다.디버그 빌드가 릴리스보다 훨씬 느리게 컴파일됩니다.

나는 항상 릴리스 빌드가 최적화 때문에 더 오래 걸릴 것이라고 생각했습니다. 왜 디버그 빌드가 릴리스보다 오래 걸릴까요? 어쨌든 우리의 디버그 속도를 출시만큼 빠르게 할 수 있습니까?

우리는 상당한 양의 boost/stl 코드를 가지고 있습니다.

+1

프리 컴파일 된 헤더를 둘 다 사용하고 있습니까? –

+0

빌드 옵션이란 무엇입니까? –

+1

예 모두 PCH입니다./I/D PCH 이외의 빌드 옵션은/Od/Gm/EHsc/RTC1/MDd/W4/nologo/c/Wp64/ZI/TP/errorReport : prompt/wd4018/Zm200입니다. 그래, 우리가 거기에 "큰 선택적인 파일을 써야"했는지 궁금했다. 시간은 단지 라이브러리를 만들 뿐이므로 링크가 없습니다. – Philip

답변

0

저는 여기에 starbolin의 코멘트를 대답으로 넣을 것입니다 : apples and oranges. I/O 제한에 대한 charley의 추측은 프로세스 모니터 계산에서 600MB (디버그 용)와 300MB (릴리스 용)로 계산되지 않았습니다. 즉, 300MB를 추가로 쓰려면 4 분이 아니라 몇 초가 걸릴 것입니다.따라서 디버그 빌드와 릴리스 빌드 사이에는 여러 가지가있을 가능성이 높습니다. 최적화 작업이 최적화 작업보다 더 오래 걸릴지라도 이러한 다른 디버그 작업은 그보다 더 많은 시간이 필요합니다. 디버그 및 릴리스에 대한 시간이 정확히 어디인지에 대한 분석을 보려면 좋겠지 만 상당히 다른 프로세스이고 디버그는 Visual Studio 2005 및 벤치마킹 된 프로젝트에 대해 더 오래 걸립니다.

7

최상의 추측 : 디버그 빌드는 입출력 제한이 적용되고 릴리스 빌드는 프로세서 제한 (이 경우)입니다.

우리는 빌드 시스템에 대한 광범위한 벤치마킹을 수행했습니다. DEBUG*.pdb 정보를 많이 작성하고, 더 많은 수의 *.obj 파일 (추가 디버깅 정보 용)을 작성합니다. 결과적으로 디스크 활동이 훨씬 늘어납니다. 이 등 대조적으로

RELEASE훨씬 작은 *.obj 파일을 작성하고, 아무튼 구축, 더욱 당신이 당신의 소스 코드 (테이블, 문자, 문자열 리터럴)의 "리터럴"많은 경우 강조된다 "디버그"데이터베이스를 작성하는 것이 번거롭지 않습니다 (일반적인 스위치로 RELEASE을 컴파일하면). 그러나 RELEASE 빌드의 링커는 최적화를 수행해야하며 다른 많은 작업은 단지 DEBUG에서 수행되지 않으므로 프로세서에 바인딩됩니다. 이것은 가장 어려운 링커 스위치를 사용하여 "compile-to-maximize-speed/size"를 사용하면 RELEASE에 대해 시간이 더 필요합니다.

(예, RELEASE 빌드는 실행 가능 디스크의 I/O 업데이트 주소를 사용해야하지만 실행 파일은 RELEASE 빌드에서 너무 작기 때문에 페이지를 많이 작성해야합니다. 이하, 그래서 RELEASE 빌드에서 I/O 페널티만큼 DEBUG 빌드로하지 않습니다.) 당신은 배 "RELEASEDEBUG보다 더 비싸다"을 관찰하고

. 많은 템플릿, 많은 기호 및 리터럴 등으로 I/O 바인딩 된 일부 프로젝트의 경우에 적합합니다. 드라이브가 가득 차 있는지, 느리게 움직이는 지, 불량 섹터가 있는지 확인하십시오. ? 그것들은 DEBUG 빌드를 위해 더 나 빠지게 (더 느리게) 만들 것입니다.

예, 다른 빌드는 "보다 3 배 더 비싸지 만 DEBUG"과 같이 반대편이어야합니다. 이러한 빌드는 I/O 바인딩이 아닌 프로세서/링커 바인딩입니다.

[업데이트],이 질문은 "static-library, no-linking"입니다. I/O (많은 디스크 활동, 링크 없음)에 대한 시간 낭비와 프로세서 최적화 (최적화가 수행되지 않았기 때문에)가없는 최악의 시나리오입니다. 따라서 3 배가 "DEBUG -is-slow-than-RELEASE"이면이 프로젝트에서 얻을 수있는 것만 큼 나쁘지는 않을 것입니다. 연결 옵션을 추가하면 RELEASE이 느려집니다.

+2

파일 시스템 캐시의 느린 후기 입 덕분에 파일을 쓰는 것이 Windows에서 정말 저렴합니다. 이 대답은 컴퓨터가 심각하게 RAM 제약을받는 경우에만 의미가 있습니다. 일일이 발생할 수 있지만 기가 바이트 상당의 객체/디버그 데이터를 생성하는 것은 쉽지 않습니다. –

+0

@Hans, 일종의 동의. 게으른 도움말을 쓰지 만 NTFS는 다른 파일 시스템과 비교하여 거의 모든 파일 작업에 놀랍도록 비쌉니다. 파일이 네트워크 리소스를 통해 캐싱/전송되는 경우 물론 게으른 쓰기는 전혀 도움이되지 않습니다 (예 : 팜 빌드, 분산 빌드 시스템). Win7은 (Win7 보안 향상으로 인해) XP/Vista보다 파일 핸들링 패널티/레이턴시 이상을 추가하여 임베디드 시스템에서 모든 종류의 파일/포트 핸들 문제를 일으켰습니다. – charley

+1

[이 블로그 게시물] (http://blogs.microsoft.co.il/blogs/arik/archive/2011/05/10/how-to-check-how-many-writes-are-done-while-you -build.aspx)는 디버그 및 릴리스로 작성된 바이트를 측정하는 방법을 설명합니다. devenv.exe 및 cl.exe를 모니터링해야합니다. 릴리스 용으로 작성된 약 300MB와 디버그 용으로 작성된 600MB가 나왔습니다. 1GB의 항목을 복사하는 셸에서 테스트 한 결과 약 10 초가 걸렸습니다. 따라서 300MB를 추가로 쓰는 데 실제로 4 분 정도 더 오래 걸릴 수는 없다고 생각합니다. IO 외에 다른 컴파일러 활동이 있어야합니다. – Philip

관련 문제