저번 포스트에서 gcc 컴파일 옵션에서 -pg옵션을 붙였다. 이게 뭔지 알아보자 

 

 


프로파일?

차근차근 보자. 프로그램을 프로파일링한다는 의미는 무엇일까?

아래와 같은 주요 측정 지표를 확인하며, 코드의 특정 부분이 얼마나 많은 리소스를 사용하는지 분석하는 과정을 포함합니다. 이를 통해 코드 최적화가 필요한 부분을 식별할 수 있다. 

  1. CPU 사용 시간: 특정 함수나 코드 블록이 실행되는데 걸리는 시간. 프로파일링을 통해 어느 함수가 CPU 시간을 가장 많이 소비하는지 파악할 수 있습니다.
  2. 메모리 사용량: 프로그램 실행 중에 사용된 메모리의 양을 측정합니다. 메모리 누수 문제를 파악하거나, 메모리 사용량을 최적화하는 데 유용합니다.
  3. 함수 호출 횟수: 각 함수가 얼마나 자주 호출되는지를 추적합니다. 높은 호출 빈도를 가지는 함수는 성능 병목의 원인이 될 수 있습니다.

gprof 프로파일러 

먼저 프로그램을 컴파일하며 -pg 옵션을 준뒤, 만들어진 실행파일을 한번실행시키면 gmon.out이라는 프로파일링 파일이 생긴다. 

 

 

 

위처럼 원래 없었는데 실행시킨뒤 gmon.out 파일이 생성됨을 볼 수 있다. 

 

gmon.out 파일 생성이 확인되면 "gprof 실행 파일명 gmon.out > ~.txt"로 프로파일링 보고서를 위의 그림과 같이 텍스트 파일로 만들 수 있다. 파일을 열어보면 항목 하단에 필드의 의미가 무엇인지 설명하고 있으므로 참조한다.  

결과 프로파일링은 위와같은 화면으로 나오며, 자세한 내부 원리는 아래와 같다. 

 

1. 타이머: 

- 타이머를 통해 10ms 마다 PC를 조사하고, 시그널 핸들러가 PC 카운터를 증가시킨다.

- settimer를 통해 main 이전에 SIGPROF 시그널이 발생된다.

 

 

2. enter/exit 후킹

- 함수 호출 전에 mcount 함수 호출

- 호출 전의 PC와 호출 후의 PC를 이용하여 콜 그래프를 작성하고, 함수 호출 횟수를 기록한다. 

 

다음엔 최적화 방법 몇개를 살펴보자 

 

 

다락공방