수색…


gcc 및 gprof로 프로파일 링

GNU gprof 프로파일 러 인 gprof 를 사용하면 코드를 프로파일 링 할 수 있습니다. 이를 사용하려면 다음 단계를 수행해야합니다.

  1. 프로파일 링 정보를 생성하는 설정을 사용하여 응용 프로그램 만들기

  2. 빌드 된 응용 프로그램을 실행하여 프로파일 링 정보 생성

  3. 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 프로파일 러를 제공합니다. 그것을 사용하려면 :

  1. Google Perf 도구 설치
  2. 평소대로 코드 컴파일
  3. 런타임에 라이브러리로드 경로에 libprofiler 프로파일 러 라이브러리를 추가하십시오.
  4. 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


Modified text is an extract of the original Stack Overflow Documentation
아래 라이선스 CC BY-SA 3.0
와 제휴하지 않음 Stack Overflow