수색…
gcc 및 gprof로 프로파일 링
GNU gprof 프로파일 러 인 gprof 를 사용하면 코드를 프로파일 링 할 수 있습니다. 이를 사용하려면 다음 단계를 수행해야합니다.
프로파일 링 정보를 생성하는 설정을 사용하여 응용 프로그램 만들기
빌드 된 응용 프로그램을 실행하여 프로파일 링 정보 생성
gprof로 생성 된 프로파일 링 정보보기
프로파일 링 정보를 생성하는 설정으로 응용 프로그램을 빌드하기 위해 -pg
플래그를 추가합니다. 예를 들어, 우리는
$ gcc -pg *.cpp -o app
또는
$ gcc -O2 -pg *.cpp -o app
기타 등등.
app
이라는 애플리케이션이 빌드되면 평소와 같이 실행하십시오.
$ ./app
그러면 gmon.out
이라는 파일이 생성됩니다.
프로파일 링 결과를 보려면 이제 실행하십시오.
$ gprof app gmon.out
(우리는 생성 된 출력뿐만 아니라 애플리케이션도 제공함).
물론 파이프 또는 리디렉션 할 수도 있습니다.
$ gprof app gmon.out | less
기타 등등.
마지막 명령의 결과는 행이 함수이고 통화 수, 총 시간, 자체 시간 (즉, 자식 호출을 제외한 함수에서 보낸 시간)을 나타내는 열이있는 테이블이어야합니다.
gperf2dot로 콜 그래프 다이어그램 생성하기
보다 복잡한 응용 프로그램의 경우 플랫 실행 프로파일을 따르기가 어려울 수 있습니다. 이것이 많은 프로파일 링 도구가 주석이 달린 콜 그래프 정보의 일부 형식을 생성하는 이유입니다.
gperf2dot 는 많은 프로파일 러 (Linux perf, callgrind, oprofile 등)의 텍스트 출력을 콜 그래프 다이어그램으로 변환합니다. 프로파일 러를 실행하여 사용할 수 있습니다 ( gprof
예제).
# compile with profiling flags
g++ *.cpp -pg
# run to generate profiling data
./main
# translate profiling data to text, create image
gprof ./main | gprof2dot -s | dot -Tpng -o output.png
gcc 및 Google Perf 도구로 CPU 사용량 프로파일 링
Google Perf Tools 는 약간 친숙한 인터페이스로 CPU 프로파일 러를 제공합니다. 그것을 사용하려면 :
- Google Perf 도구 설치
- 평소대로 코드 컴파일
- 런타임에 라이브러리로드 경로에
libprofiler
프로파일 러 라이브러리를 추가하십시오. -
pprof
를 사용하여 플랫 실행 프로필 또는 콜 그래프 다이어그램 생성
예 :
# compile code
g++ -O3 -std=c++11 main.cpp -o main
# run with profiler
LD_PRELOAD=/usr/local/lib/libprofiler.so CPUPROFILE=main.prof CPUPROFILE_FREQUENCY=100000 ./main
어디에:
-
CPUPROFILE
은 프로파일 링 데이터의 출력 파일을 나타냅니다. -
CPUPROFILE_FREQUENCY
는 프로파일 러 샘플링 빈도를 나타냅니다.
프로파일 링 데이터를 사후 처리하려면 pprof
를 사용하십시오.
평면 통화 프로필을 텍스트로 생성 할 수 있습니다.
$ pprof --text ./main main.prof
PROFILE: interrupts/evictions/bytes = 67/15/2016
pprof --text --lines ./main main.prof
Using local file ./main.
Using local file main.prof.
Total: 67 samples
22 32.8% 32.8% 67 100.0% longRunningFoo ??:0
20 29.9% 62.7% 20 29.9% __memmove_ssse3_back /build/eglibc-3GlaMS/eglibc-2.19/string/../sysdeps/x86_64/multiarch/memcpy-ssse3-back.S:1627
4 6.0% 68.7% 4 6.0% __memmove_ssse3_back /build/eglibc-3GlaMS/eglibc-2.19/string/../sysdeps/x86_64/multiarch/memcpy-ssse3-back.S:1619
3 4.5% 73.1% 3 4.5% __random_r /build/eglibc-3GlaMS/eglibc-2.19/stdlib/random_r.c:388
3 4.5% 77.6% 3 4.5% __random_r /build/eglibc-3GlaMS/eglibc-2.19/stdlib/random_r.c:401
2 3.0% 80.6% 2 3.0% __munmap /build/eglibc-3GlaMS/eglibc-2.19/misc/../sysdeps/unix/syscall-template.S:81
2 3.0% 83.6% 12 17.9% __random /build/eglibc-3GlaMS/eglibc-2.19/stdlib/random.c:298
2 3.0% 86.6% 2 3.0% __random_r /build/eglibc-3GlaMS/eglibc-2.19/stdlib/random_r.c:385
2 3.0% 89.6% 2 3.0% rand /build/eglibc-3GlaMS/eglibc-2.19/stdlib/rand.c:26
1 1.5% 91.0% 1 1.5% __memmove_ssse3_back /build/eglibc-3GlaMS/eglibc-2.19/string/../sysdeps/x86_64/multiarch/memcpy-ssse3-back.S:1617
1 1.5% 92.5% 1 1.5% __memmove_ssse3_back /build/eglibc-3GlaMS/eglibc-2.19/string/../sysdeps/x86_64/multiarch/memcpy-ssse3-back.S:1623
1 1.5% 94.0% 1 1.5% __random /build/eglibc-3GlaMS/eglibc-2.19/stdlib/random.c:293
1 1.5% 95.5% 1 1.5% __random /build/eglibc-3GlaMS/eglibc-2.19/stdlib/random.c:296
1 1.5% 97.0% 1 1.5% __random_r /build/eglibc-3GlaMS/eglibc-2.19/stdlib/random_r.c:371
1 1.5% 98.5% 1 1.5% __random_r /build/eglibc-3GlaMS/eglibc-2.19/stdlib/random_r.c:381
1 1.5% 100.0% 1 1.5% rand /build/eglibc-3GlaMS/eglibc-2.19/stdlib/rand.c:28
0 0.0% 100.0% 67 100.0% __libc_start_main /build/eglibc-3GlaMS/eglibc-2.19/csu/libc-start.c:287
0 0.0% 100.0% 67 100.0% _start ??:0
0 0.0% 100.0% 67 100.0% main ??:0
0 0.0% 100.0% 14 20.9% rand /build/eglibc-3GlaMS/eglibc-2.19/stdlib/rand.c:27
0 0.0% 100.0% 27 40.3% std::vector::_M_emplace_back_aux ??:0
... 또는 PDF로 주석 달린 콜 그래프를 생성 할 수 있습니다.
pprof --pdf ./main main.prof > out.pdf