2011-02-17 9 views
2

gprof를 사용하여 C++ 기능을 프로파일하려고하는데, 취한 시간은 intrested입니다. 나는 한 번 이상 뛰었고 어떤 이유로 나는 결과에 큰 차이가있었습니다. 나는 이것이 무엇을 일으키는 지 모르지만 샘플링 속도를 가정하고 있거나 I/O와 관련이있는 다른 게시물을 읽었습니다. 그래서 그것을 더 정확하고 어떻게 든 거의 일정한 결과를 생성하는 방법이 있습니까?gprof 출력의 부정확도

나는 다음과 같은 생각을했다

:

  1. 가 캐시
  2. 다른 프로파일을 사용하는 것을 실행하기 전에 샘플링 속도를
  3. 높이를 증가하지만 난 그게 grof 유사한 형식으로 결과를 생성 할 함수 시간 % 함수 이름, 나는 Valgrind를 시도했다. 그러나 그것은 나에게 크기의 거대한 파일을 주었다. 그래서 아마도 잘못된 명령으로 파일을 생성하고있을 것입니다.

이 리눅스의 경우 http://www.cs.utah.edu/dept/old/texinfo/as/gprof.html#SEC11

를 참조 후, 내가 필요로하지 않는 프로파일 러를 추천, 귀하의 의견

감사

답변

4

the gprof paper 사본을 인쇄하여 신중하게 읽는 것이 좋습니다.

논문에 따르면 gprof가 시간을 측정하는 방법은 다음과 같습니다. PC를 샘플링하고 각 루틴에서 샘플 수를 계산합니다. 샘플 사이의 시간을 곱하면 각 루틴의 전체 시간은 입니다.

또한 호출 사이트별로 루틴 A가 루틴 B를 호출하는 횟수를 테이블에 기록합니다. 루틴 B는 -pg 옵션으로 계측됩니다. 그것들을 요약함으로써 루틴 B가 호출 된 횟수를 알 수 있습니다.

총 시간 = 자체 시간 인 호출 트리의 맨 아래부터 시작하여 각 루틴의 평균 호출 시간이 총 시간을 호출 횟수로 나눈 값으로 가정합니다.

그런 다음 해당 루틴의 각 호출자에게 다시 작동합니다. 각 루틴의 시간은 평균 자체 시간과 각 하위 루틴에 대한 평균 호출 시간에 하위 루틴의 평균 시간을 더한 시간입니다.

재귀 (콜 그래프의 사이클)가없는 경우에도 평균 시간 및 평균 통화 수에 대한 가정과 계측중인 서브 루틴에 대한 가정과 같이 오류의 가능성이 얼마나 많은지 알 수 있습니다. 저자들이 지적했다. 재귀 인 경우, 기본적으로 "잊어 버리십시오"라고 말합니다.

이 기술은 모두 문제가되지 않더라도 질문을 던집니다. 무엇이 목적입니까? 대개 그 목적은 "병목 현상 찾기"입니다. 이 논문에 따르면 사람들이 대안 구현을 평가하는 데 도움이 될 수 있습니다. 그것은 병목 현상을 발견하지 못합니다.그들은 많은 시간이 걸리거나 평균 시간이 높은 루틴을 살펴볼 것을 권장합니다. 물론 낮은 평균 누적 시간이 루틴은 무시해야한다,하지만 매우 문제를 지역화하지 않습니다. 수행되는 모든 I/O는 의심 할 여지없이 필요한 경우로, 그것은 완전히, O/I 무시합니다.

그래서, 하나, 귀하의 질문에 대답 Zoom을 시도하려고하고, 측정에서 통계적 노이즈를 제거하기 위해 기대하지 않습니다.

gprof의는 단순하고 견고한 유서 깊은 도구이지만, 처음에했던 문제는 여전히 존재하며, 훨씬 더 나은 도구가 개입 수십 년 함께왔다. Here's a list of the issues.

2

gprof은 특히 작은 기능, 매우 정확하지 않습니다 대기 인스트루먼트 될 코드 Zoom - 30 일 평가판 라이센스를 무료로 받으실 수 있습니다.

모든 샘플링 프로파일 러는 통계적으로 부정확 한 형식을 갖습니다. 오류가 너무 큰 경우 더 길거나 더 작은 샘플링 간격으로 샘플링해야합니다.