2016-08-30 3 views
12

(이 GCC와 그 소리에 대한 질문이지만, 다른 컴파일러에 적용 할 수 있습니다.) -g로 컴파일하면 성능이 떨어 집니까?

내 C 또는 C++ 코드를 컴파일하고 -g 스위치를 사용하여 디버그 정보를 생성하는 경우

은의 성능을 저하이 자체 않습니다 어떤 식 으로든 컴파일 된 프로그램 ... (1.) 최소 최적화 ( -O0)? (2) 최대 최적화 ( -O3)?

참고 : 나는 여분의 콘텐츠로 인해 실행 파일을 구문 분석 /로드해야하는 데 따른 성능 저하를 의미하지는 않습니다. 나는 실행되는 코드를 의미합니다.

+1

'-g'로 컴파일 된 프로그램과'-g'없이 컴파일 된 프로그램을 비교하십시오. 실제 생성 된 코드에는 차이가 없어야합니다. –

+4

@JoachimPileborg : 특정 프로그램에 대해 생성 된 코드에 차이가 있다는 것을 알지 못한다고해서 반드시 아무런 차이가 없음을 의미하지는 않습니다. – einpoklum

+0

엄밀히 말하면 : 예, 적어도 실행 파일 내에 디버깅 기호를 보관하면 이는로드가 더 많다는 것을 의미하기 때문입니다 (또는로드하는 동안 건너 뜁니다). 하지만 실제로는 IMO가 무시할 정도입니다. –

답변

6

성능 차이가 있다고 생각하지 않습니다. 실제로 생성 된 코드는 -g이고 -Ohere 문서에 따라 사용 가능합니다. 게다가, 디버깅 심볼은 코드에 쓰이지 않고 "디버그 섹션"이라고 불리는 다른 섹션 (런타임에서는 디버거만으로도로드되지 않음)에 작성됩니다.

-g 실행되는 최적화 또는 코드가 변경되지 않습니다. . 최적화 된 코드에 의해 촬영

바로 가기 가끔 놀랄 수 있습니다 : 같은 문서한다고 것을주의하는 것이 유용 할 수 있습니다 그러나

here을 언급 한 바와 같이 GCC 정책 일부 변수는 선언하지 않을 수 있습니다 전혀 존재하지 않는다. 제어 흐름이 당신이 예상하지 못한 곳으로 잠시 이동할 수 있습니다; 상수 결과를 계산하거나 그 값이 이미 이기 때문에 일부 문은 이 실행되지 않을 수 있습니다. 일부 문은 루프 밖으로 이동되었으므로 다른 곳에서 실행될 수 있습니다 ( ). 그럼에도 불구하고 은 최적화 된 출력을 디버그 할 수 있습니다. 버그가있을 수있는 프로그램에 최적화 프로그램을 사용하는 것이 합리적입니다.

그래서 결국 디버깅 최적화를 해치지 않을 것이다 그러나 반대는 거짓과 (예를 들어 쓸모없는 변수를 삭제하여) 당신의 디버깅 정보를 저하 될 수 있습니다 -O3을 사용하고 있습니다.

최적화 디버깅 경험 : (here을 언급 한 바와 같이)이 때문에 -Og를 사용하는 경우에 더 좋을 수 있다는

참고. -Og는 디버깅을 방해하지 않는 최적화를 가능하게합니다. 표준 편집 - 컴파일 - 디버그주기에 맞게 최적화 수준을 선택해야하며 의 적절한 최적화 수준을 제공하면서 빠른 컴파일 및 우수한 디버깅 환경을 유지해야합니다.

그러나 이것은 디버깅을 방해하는 일부 최적화 단계가 수행되지 않기 때문에 성능에 영향을 미칩니다.


편집 :

링크와 인용은 clang 같은 다른 컴파일러에 적용되지 않을 수 있습니다 gcc .IT에 대한 귀하의 질문에 대답. 그러나 clang에 대한 설명서도 있습니다. 예를 here를 들어 : 기본적으로

는, 디버그 정보는 당신이 디버거에서 실행 당신이 임의 프로그램을 수정할 수 있도록 전체 디버그 정보를 "-O0 -g"로 프로그램을 컴파일하고 얻을 수 있습니다 . 을 "-O3 -g"로 컴파일하면 항상 이고 읽을 수있는 전체 디버그 정보가 제공됩니다 (예 : 꼬리 호출 제거 ​​및 인라인에도 불구하고 정확한 스택 추적을 얻음). 그러나 능력을 잃을 수 있습니다. 프로그램을 수정하고 이 프로그램 밖으로 최적화 된 곳에서 함수를 호출하거나 완전히 인라인 된 상태로 만듭니다.

+0

@einpoklum 그것은 단지 알림이었습니다. 그러나 나는 처음이 당신의 질문에 대답한다고 생각합니다. 그것은 단지 당신이 그것을 알지도 모르는 다른 정보일지도 모르는 부가적인 정보 일뿐입니다. 나는 당신이 당신의 의견을 삭제 한 것을 보았습니다, 그 이유는 무엇입니까? 제 질문에 여기에 답한 것 같아요. – LBes

-1

디버거 외부에서 실행하면 성능에 문제가 없습니다. 디버그 기호는 디버깅을 돕는 것입니다. 생성 된 코드는 두 경우 모두 동일해야합니다.

+3

귀하의 의견을지지하기 위해 뭔가를 게시하십시오. – Zereges

1

-g 플래그는 디버깅 정보를 바이너리에 추가합니다. 이것은 CPU 실행 비트 .text에서 실행 파일의 별도 섹션 (.stab.stabstr)에 존재합니다. 디버거 외부에서 실행될 때 디버그 섹션은 운영 체제 로더에 의해로드되지 않습니다. 디버그 정보는 strip 유틸리티를 사용하여 쉽게 제거 할 수 있으며 -g 플래그없이 컴파일 된 것과 동일한 바이너리를 생성합니다.

그러나 일반적으로 디버깅 할 때 최적화없이 컴파일되고 NDEBUG 전 처리기 매크로가 필요합니다. 그러나 이러한 것들은 -g 플래그로 제어되지 않습니다.