나는 다소 큰 템플릿 헤더 전용 C ++ 라이브러리를 작성하는 경향이 있으며 사용자는 일반적으로 컴파일 시간에 대해 불평합니다. 그 문제에 대해 생각 해보니 시간이 어디로 가는지 전혀 모른다는 생각이 들었 습니다 . g ++, icc 및 xlC와 같은 일반적인 컴파일러로 C ++ 컴파일 프로세스를 프로파일 링하는 간단한 방법이 있습니까? 예를 들어 C ++ 컴파일의 각 단계 에서 얼마나 많은 시간이 소요되는지 알 수 있습니까?
나는 다소 큰 템플릿 헤더 전용 C ++ 라이브러리를 작성하는 경향이 있으며 사용자는 일반적으로 컴파일 시간에 대해 불평합니다. 그 문제에 대해 생각 해보니 시간이 어디로 가는지 전혀 모른다는 생각이 들었 습니다 . g ++, icc 및 xlC와 같은 일반적인 컴파일러로 C ++ 컴파일 프로세스를 프로파일 링하는 간단한 방법이 있습니까? 예를 들어 C ++ 컴파일의 각 단계 에서 얼마나 많은 시간이 소요되는지 알 수 있습니까?
답변:
들어 GCC 가 디버깅 옵션을 찾을how much time is spent within each of the phases of C++ compilation?
-큐 컴파일러가 컴파일 될 때 각 함수 이름을 인쇄하고 완료되면 각 패스에 대한 통계를 인쇄합니다.
-ftime-report 컴파일러가 각 패스가 완료 될 때 소비 된 시간에 대한 통계를 인쇄하도록합니다.
패스는 GCCINT 9 : 컴파일러의 패스 및 파일에 설명되어 있습니다.
-v -ftime-report
여기에서 단일 소스 파일의 g ++ 컴파일 출력을 게시 하여 논의 할 수 있습니다. GCC 메일 링리스트 에 도움이 될 수 있습니다 .
컴파일러를 들어 GCC 이외의 (또는 GCC 개 고대의 이상 3.3.6 )이 글의 다른 옵션을 참조하십시오.
-Q
출력은 awk 또는 perl 스크립트에 의해 파악, 구문 분석 및 분석 될 수 있습니다. 또는 콘솔에서 함수 이름 인쇄를 볼 수 있습니다. 긴 일시 중지 후에 인쇄 된 것은 컴파일하기가 어려웠습니다.
gcc/toplev.c
( announce_function
- "함수 정의의 시작 부분이 구문 분석되면이 함수는 stderr에 함수 이름을 인쇄합니다"). 이것은 announce_function
타임 스탬프 (gettimeofday) 인쇄를 추가하거나 버퍼링되지 않은 방식으로 출력을 다시 쓰는 지점 이 될 수 있습니다. 또는 다른 가능한 방법은 디버그 덤프 ( -fdump-rtl-all-all
-fdump-tree-all-all
-fdump-ipa-all-all
) 를 활성화하는 것이지만 패스 당 1 개의 파일을 출력합니다. 패스 및 함수 당 1 개의 파일을 출력하도록 변환해야합니다 (생성 시간과 함께 많은 파일 가져 오기).
거기에 있는 도구 거의 모든 컴파일러와 빌드 시스템에 유용 할 수있는 부스트 프로젝트에서이.
이 도구에는 및 매크로 호출을 사용하는 소스 코드 계측 이 필요 합니다. 그런 다음 이러한 매크로는 컴파일 타임에 특정 진단 (경고)을 생성하며, 인스턴스화 콜 스택과 함께 시간이 지정되고 수집됩니다 (결과적으로 빌드 및 시각화가 가능합니다.TEMPLATE_PROFILE_ENTER()
TEMPLATE_PROFILE_EXIT()
하며, 스크립트에 의해 콜 그래프를 작성 됩니다. 나쁘지 않습니다, IMO.
그래도 아직 사용하지 않았습니다.
나는 아직 그것을 시도하지 않았지만 templight는 매우 유망 해 보인다 : https://github.com/mikael-s-persson/templight
당신은 그것들을 어느 정도 분리 할 수 있습니다 (나는 가정하고 있습니다 make
)
-E
스위치 사용)과 .PHONY
일반 바이너리 대상이 .o
파일에 의존하는 것처럼 전 처리기 출력 파일에 의존하는 대상을 추가 합니다. 이 타겟을 구축하는 데 걸리는 시간 측정'PHONY
모든 .o
파일 에 종속 되지만 링크하지 않는 대상을 추가하십시오 . 이 타겟을 구축하는 데 걸리는 시간 측정 (깨끗한 상태에서)이제 사전 처리, 컴파일 및 링크하는 데 걸리는 시간을 알 수 있습니다. 또한 -O0
두 번째 및 세 번째 대상의 최적화 된 버전과 최적화되지 않은 버전 ( )을 비교 하여 최적화 프로그램에서 소요 된 시간을 확인할 수 있습니다.
다른 사람들은 -ftime-report
GCC에 대한 명령 줄 플래그를 이미 제안했습니다.이 플래그는 컴파일러가 각 컴파일 단계에서 소비 된 시간에 대한 통계를 인쇄하게합니다. 단점은 한 단위에 대한 요약 만 표시한다는 것입니다.
프로젝트 빌드 로그 파일이 주어지면 각 컴파일 단계에서 모든 단위에 대한 전체 요약을 인쇄 할 수 있는 Python 스크립트를 작성했습니다 . 또한 다른 단계로 정렬 할 수도 있습니다. 또한 두 개의 로그 파일을 비교할 수도 있습니다 (예 : 변경 사항의 영향을 이해하려는 경우).