@ cypheon의 답변 덕분에 BuGLe를 체크 아웃했습니다. 환상적이지만 유용한 프로파일 링 출력을 얻으려면 약간의 시간을 소비해야했습니다. 이 답변에 대한 의견으로 추가하고 싶었지만 전체 코드 예제를 붙여 넣어 새로운 답변을 시작해야했습니다.
그가 제안했듯이 stats_calltimes 필터는 프로파일 링에 적합합니다 (호출 스택 정보를 표시하지 않으므로 이상적이지는 않지만) 약간의 작업만으로도 각 GL 함수의 전체 플랫 시간을 표시 할 수 있습니다 프레임 당.
~/.bugle/filters
및 ~/.bugle/statistics
파일을 모두 편집해야합니다.
chain showcalltimes
{
filterset stats_calls
filterset stats_calltimes
filterset showstats
{
show "average time per call"
}
}
이제 명령으로 프로그램을 실행합니다 : 첫째, filters
의 끝이 체인을 추가
BUGLE_CHAIN=showcalltimes LD_PRELOAD=libbugle.so <your-program>
이 프레임 당 각 GL 기능에서 보낸 평균 시간을 인쇄합니다. 프레임 당 수천 번 호출되는 glVertex
과 같은 호출의 경우 누적 시간이 상당히 중요하더라도 0.00ms로 표시되기 때문에 그 자체로는별로 유용하지 않습니다. 그래서 statistics
에 새 항목을 추가 호출되지 않았다 어떤 기능으로 나누기 오류가 발생하는 d("calls:*")
에 의해 곱셈과 나눗셈 :
"total time per call" = d("calls:*")/d("calls:*") * d("calltimes:*")/d("frames") * 1000
{
precision 3
label "* (ms)"
}
내가 동일 "호출 프레임 당"통계와 같은 트릭을 사용 모든 관련없는 기능에 대해 0.00이 표시되지 않도록합니다.
이제, 우리는 filters
에 추가 showcalltimes
체인 이동, 변경 "average time per call"
"total time per call"
에 :
chain showcalltimes
{
filterset stats_calls
filterset stats_calltimes
filterset showstats
{
show "total time per call"
#key_accumulate "A"
#key_noaccumulate "I"
}
}
그리고 지금 우리는 프레임 당, 각 기능에 소요 된 총 시간의 유용한 통계를 볼 수 있습니다. 이러한 통계를 여러 프레임에 걸쳐 평균화하려면 위의 key_accumulate
줄의 주석 처리를 제거한 다음 "A"를 누르거나 원하는 키로 다시 매핑하여 누적을 시작할 수 있습니다. 시간이 지남에 따라 많은 프레임에서 평균대로 통계가 너무 많이 튀는 것을 볼 수 있습니다.
또한이 체인 출력 파일에 이러한 통계를 기록 할 수 있습니다 :
chain logcalltimes
{
filterset stats_calls
filterset stats_calltimes
filterset log
{
filename "bugle.log"
}
filterset logstats
{
show "total time per call"
}
}
이 단순히 다른 후 각 프레임 하나에 대한 개별 통계를두고 있기 때문에, 읽기가 매우 어렵습니다, 나는 천국 시간이 지남에 따라 평균을내는 방법을 찾지 못했습니다. 그래서 선호하는 통계 읽기 방법은 accumulator가 켜진 showcalltimes
체인입니다.
+1! 실제로 필요한 것은 아니지만 유용합니다. 그리고 미래에 적절한 프로파일 링 지원을 포함하기를 희망 할 수 있습니다. – Staffan
팁 주셔서 감사합니다. 나는 BuGLe를 시험해 보았고 환상적이다. (물론 자유롭고 오픈 소스 다.) 그러나 유용한 프로파일 링 출력을 얻으려면 약간의 작업이 필요하므로 좋은 프로파일 출력을 얻는 방법을 자세히 설명하는 [새로운 대답] (http://stackoverflow.com/a/8859325/368821)을 추가했습니다. – mgiuca