2012-12-03 9 views
14

나는 소음과 계산을 제거하여 내 코드의 특정 부분을 (Callgrind로) 프로파일 링하려고합니다. 여기 내가 뭘 원하는지의 예입니다Callgrind : 내 코드의 특정 부분 프로필 작성

for (int i=0; i<maxSample; ++i) { 
    //Prepare data to be processed... 
    //Method to be profiled with these data 
    //Post operation on the data 
} 

내 사용 사례는 회귀 테스트, 난 문제의 방법 미만 10 % 추가와 같은 (일이 충분히 빨리 여전히이 있는지 확인하려면 마지막 구현 이후 지침). 이 때문에 Callgrind 출력 형식을보다 깨끗하게하고 싶습니다. 는

내 첫 번째 시도가 코드를 변경하는 것이 었습니다 (나는 프로필하려는 방법의 행동의 좋은 평가를하기 위해 처리 상당한 양의 데이터를하기 위해 루프를 필요) :

for (int i=0; i<maxSample; ++i) { 
    //Prepare data to be processed... 
    CALLGRIND_START_INSTRUMENTATION; 
    //Method to be profiled with these data 
    CALLGRIND_STOP_INSTRUMENTATION; 
    //Post operation on the data 
} 
CALLGRIND_DUMP_STATS; 

계측을 제어하기위한 Callgrind 매크로 추가. 또한 --instr-atstart = no 옵션을 추가하여 필자가 원하는 코드의 일부만 프로파일 링하도록했습니다 ...

불행하게도이 구성은 callgrind를 사용하여 실행 파일을 시작할 때 끝나지 않습니다. ... 느린 문제는 아닙니다. 1 분 이내에 전체 계측을 실행해야하기 때문입니다.

가 나는 또한

for (int i=0; i<maxSample; ++i) { 
    //Prepare data to be processed... 
    CALLGRIND_TOGGLE_COLLECT; 
    //Method to be profiled with these data 
    CALLGRIND_TOGGLE_COLLECT; 
    //Post operation on the data 
} 
CALLGRIND_DUMP_STATS; 

(또는 --toggle-수집 = "MyMethod라는"옵션) 을 시도하지만 Callgrind 어떤 전화없이 나에게 로그를 반환 (KCachegrind는 :(눈처럼 흰색과 제로 지침을 말한다 ...)

내가 올바르게 매크로/옵션을 사용 했습니까? 내가 예상 된 결과를 얻기 위해 변경할 필요가 무엇인지 어떤 생각을?

답변

12

내가 마지막으로이 문제를 해결하기 위해 관리 ...이이었다 구성 문제 :

내가 코드

for (int i=0; i<maxSample; ++i) { 
    //Prepare data to be processed... 
    CALLGRIND_TOGGLE_COLLECT; 
    //Method to be profiled with these data 
    CALLGRIND_TOGGLE_COLLECT; 
    //Post operation on the data 
} 
CALLGRIND_DUMP_STATS; 

을 유지하지만 --collect-atstart으로 callgrind를 실행 = 더은 (그리고 --instr-atstart없이 = !!! 없음)과은에, 완벽하게 작동하지 않습니다 합리적인 시간 (~ 1 분).

START/STOP 장비의 문제는 callgrind가 각 반복 (각 STOP)마다 파일 (callgrind.out. # 번호)을 덤프하는 것이므로 정말 느리다는 것입니다. (5 분 후 나는 5000 회귀 테스트에 부적합한 300 000 반복 벤치 마크).

+0

계측을 시작하거나 중지하지 않으시겠습니까? – Paschalis

+1

@Paschalis start/stop은 stop을 호출 할 때마다 새로운 덤프를 생성합니다. 하나의 단일 보고서에서 집계를 가져 오려면 토글을 사용하는 것이 좋습니다 (기본적으로 활성/비활성 계측을 넘김). – joetde

+0

@joetde 응답에 감사드립니다. callgrind 나 다른 도구의 콜백/매크로가 호출되지 않는 문제에 직면했기 때문에 물었습니다. 기타 [여기] (http://goo.gl/08OM3c)! – Paschalis

0

토글 콜렉터 옵션은 트리거로 사용할 메소드를 지정하는 방법이 매우 까다 롭습니다. 실제로 인수 목록을 지정해야하며 공백까지도 일치시켜야합니다. 메서드 이름을 callgrind 출력에 나타나는 것과 똑같이 사용하십시오. 예를 들어,이 invokation을 사용하고 있습니다 :

$ valgrind 
    --tool=callgrind 
    --collect-atstart=no 
    "--toggle-collect=ctrl_simulate(float, int)" 
    ./swaag 

관찰하십시오 : 옵션 주위

  • 이중 따옴표를.
  • 괄호를 포함한 인수 목록입니다.
  • 쉼표 문자 뒤의 공백.