프로그램에서 시간을 재는 방법으로 가장 쉬운 방법은 time.h 에 있는 clock() 함수를 이용하는 방법이다.
이 함수를 이용하면 내가 원하는 부분의 시간을 직접 잴 수 있다. 관련 포스팅은 너무나도 많아서 검색하면 쉽게 나온다.
이 글에서 다룰 내용은, 한 단계 앞서서 복잡한 프로그램에서 속도를 재는 것이다.
이름하여 프로파일링 (profiling), 프로파일링이란 보통 범죄 수사를 할 때 증거와 다양한 데이터를 가지고 범죄자의 심리를 추적하여 범인의 프로필 즉, '범인은 이런 사람일 것이다.' 라는 것을 추측 하는 수사법이다.
하지만, 프로그래밍에서 profiling은 다르다. 내가 짠 프로그램에서 어느 부분이 얼마나 속도를 잡아먹는지, 프로그램의 최적화를 위해 각 모듈 (부분) 별로 걸리는 시간을 측정해준다.
python에는 cProfile 이라는 모듈이 있어서 비슷한 역할을 해준다.
C에도 비슷한 역할을 하는 다양한 프로파일러가 있는데, 리눅스에는 gcc나 g++ 컴파일러에 내장된 gprof가 있다.
gprof의 사용법은 단순히 다음의 단계를 따르면 된다.
0. 설치하기
보통 리눅스에 기본적으로 설치가 되어있지만, 혹시라도 설치가 안되어있다면 apt-get을 이용해 설치를 하자.
(혹시 centOS라면 apt-get 대신 yum으로 설치하면 된다.) 또한 당연하겠지만 gcc / g++ compiler가 있어야 한다.
sudo apt-get install binutils
1. 컴파일
우선 컴파일을 할 때 -pg 옵션을 준다.
g++ example.c -o gprofTest -pg
2. 바이너리 파일 실행
이 단계는 일반적으로 컴파일 한 바이너리 파일을 실행하는 것과 같다.
./gprofTest
3. gprof
앞의 단계에서 -pg 옵션을 주고 실행을 하면 gmon.out 파일이 나타난다. 여기에 profiling information이 들어있지만 아직 우리가 읽을 수 있는 형태가 아닌 raw form이기 때문에 gprof를 통해 읽을 수 있는 format으로 변환을 시켜줘야 한다.
용법은 다음과 같다.
gprof [binary file] gmon.out
위와 같이 실행하면 결과가 바로 나오고, 결과를 저장하고 싶다면 다음의 예제 폼을 따르면 된다.
gprof gprofTest gmon.out > profOutput.txt
4. 결과 확인
이제 profOutput.txt에 우리가 읽을 수 있는 format으로 결과가 저장되었기 때문에 읽어보면 된다.
cat profOutput.txt
이후 나오는 그림은 실제 내가 연구할 때 사용한 실행 결과 모습이다.
스크린샷 아리에도 훨씬 많은 내용들을 담고있으니, 직접 실행해서 참고하면 된다!
질문은 댓글로 언제든지 받습니다. :)
'Programing Language > C, C++' 카테고리의 다른 글
C언어 프로파일링 gprof#2 - 예제코드 (0) | 2020.06.05 |
---|