2010-01-18 3 views
16

gprof를 사용하여 내 C++ 프로그램이 시간을 보내고 있는지 파악하려고합니다. 여기에 나의 딜레마가 있습니다. 제가 릴리스 빌드에 사용하는 것과 동일한 최적화 설정으로 컴파일하면 거의 모든 것이 인라인됩니다. gprof는 모든 시간이 인라인 된 핵심 루틴에 90 %의 시간을 소비한다고합니다. 반면에 인라인을 사용하지 않고 컴파일하면 프로그램의 실행 속도가 느려집니다.적극적인 인라이닝이있을 때 C++ 프로파일 링?

내 프로그램이 인라인을 사용하여 컴파일 될 때 내 핵심 루틴에서 호출되는 절차가 얼마나 많은지 알아야합니다.

저는 쿼드 코어 Intel 머신에서 64 비트 Ubuntu 9.04를 실행하고 있습니다. google-perftools를 살펴 봤지만 x86_64에서 제대로 작동하지 않는 것 같습니다. 32 비트 컴퓨터에서 실행하는 것은 옵션이 아닙니다.

인라인이 활성화되면 내 응용 프로그램을보다 효과적으로 프로파일 링하는 방법에 대한 제안 사항이 있습니까?

편집 : 다음은 내 문제에 대한 설명입니다. 처음에 명확하지 않다면 사과드립니다.

시간을 내 신청서에서 보냈던 곳을 찾고 싶습니다. 최적화 된 빌드를 프로파일 링하면 gprof가 발생하여 시간의 90 %가 모든 것이 인라인 된 메인에 사용되었다고합니다. 프로파일 링하기 전에 이미 알고있었습니다!

필자가 알아야 할 것은 빌드 옵션에서 최적화 또는 인라인을 비활성화하지 않고 인라인 함수가 얼마나 많은 시간을 사용하고 있는지 확인하는 것입니다. 응용 프로그램은 인라이닝이 비활성화 된 상태에서 프로파일 링을 수행하면 크기가 느려질 수 있습니다. 이 실행 시간의 차이점은 편리한 문제이지만 인라인을 사용하지 않도록 설정된 프로그램의 성능 프로필이 인라인을 사용하도록 설정된 프로그램의 성능 프로필과 상당히 일치한다는 확신이 없습니다.

한마디로

은 : 최적화 나 인라인을 사용하지없이 C++ 프로그램 유용한 프로파일 정보를 얻을 수있는 방법이 있나요?

+1

http://stackoverflow.com/questions/375913/what-can-i-use-to-profile-c-code-in-linux. 이 스레드는 많은 정보를 가지고 있습니다. –

답변

0

코드가 느리게 실행되는 것은 중요하지 않습니다 (물론 편의는 고려해야합니다). 프로파일 러는 여전히 각 기능에 소요 된 정확한 시간 비율을 알려줍니다.

+0

분명한 사실을 말하고 아무런 가치도없는 또 다른 10 개의 득표 수 있습니다. - P –

+3

아마도 - 그렇지만 다시는 완전히 그렇지 않을 수도 있습니다. 함수 호출을 나무로 생각하면 모든 하위 트리가 인라이닝에서 동등하게 이익을 얻는 것은 당연한 일입니다. 현실에서는 거의 항상 거짓이 될 것입니다. 차이는 경우에 따라 중요하지 않지만 다른 경우에는 매우 중요합니다. –

+0

및 대부분의 프로파일 러는 하드웨어 인터럽트로 구동되며 다른 노이즈도 포함됩니다. –

2

CPU의 고성능 타이밍 메커니즘 (예 : x86) - 시스템 호출에 의존하지 않는 루틴과 코어 루프를 실행하는 단일 스레드를 특정 CPU에 바인딩하는 몇 가지 매크로를 개발하십시오 (set the affinity). 다음 매크로를 구현해야합니다. 이 가능성이 프로필에 가장 정확한 방법입니다 -

PROF_INIT //allocate any variables -- probably a const char 
PROF_START("name") // start a timer 
PROF_STOP() // end a timer and calculate the difference -- 
      // which you write out using a async fd 

는 난의 타이밍이 호출 트리의 상황에 호출을 배치 매크로를 확인했다 나는에 관심이있는 모든 기능에 배치하는 이런 일이 있었다 .

참고 :

이 방법은 코드에 의해 구동 - 그리고 스눕 어떤 방식으로 코드에 외부 도구에 의존하지 않습니다. 스누핑, 샘플링 및 인터럽트 기반 프로파일 링은 코드의 작은 부분에 대해서는 부정확합니다. 게다가 코드의 특정 구문 (루프, 순환 호출 체인 또는 대용량 메모리 할당의 시작과 같은)에서 타이밍 데이터를 수집하는 위치와 시점을 제어하려고합니다.

- 편집 -

당신은 link from this answer to one of my questions에 관심이있을 수 있습니다.

+0

+1. 적어도 가치가 있어야합니다. – Macke

9

당신이 원하는 것은 코드 라인이으로 최적화 할만한 가치가 있다고 생각하는 것입니다. 이는 타이밍 기능과 매우 다릅니다. You can do better than gprof.

Here's a fairly complete explanation of how to do it.

당신은 손으로 그것을 할, 또는 oprofileRotateRight/Zoom와 동일한 정보를 제공 할 수있는 프로파일 중 하나를 사용할 수 있습니다.

인라인은 인라인되는 루틴이 작고 함수 자체를 호출하지 않는 경우와 호출되는 행이 충분히 시간이 많이 걸리는 경우에만 중요한 값을가집니다.

디버그 빌드와 릴리스 빌드 간의 성능 비율의 차이는 여러 가지로 인한 것일 수도 있고 인라인되지 않았을 수도 있습니다. 위에서 언급 한 stackshot 방법을 사용하여 두 경우 모두 어떤 일이 벌어지고 있는지 확인할 수 있습니다. 예를 들어, 재귀 데이터 구조 유효성 검사와 같은 다른 이유로 디버그 빌드가 느려질 수 있다는 것을 발견했습니다.

+0

(+1) 좋은 정보, 특히 스택 샷 (즉, 키가 캡처 중이며 샘플링하지 않음) 링크가 있지만 모든 도구는 캡처하는 것보다는 측정하는 것처럼 보입니다. –

+0

@Hassan : 예. 나는 측정의 정밀도보다는 위치의 정밀도에 중점을 둔다 고 생각합니다. Oprofile 및 Zoom은 스택 클럭 시간에 스택 샘플을 가져 오며, 해당 명령문을 포함하는 샘플의 %를 제공 할 수 있습니다. 그들이 많은 샘플에서 그것을 제공한다면 그것은 괜찮은 것이지만 꼭 필요한 것은 아닙니다. 개인적으로는 손으로 직접 작업합니다. 작업중인 데이터와 같은 상태 정보를 더 많이 볼 수 있기 때문입니다. 종종 그것이 중요한 정보입니다. –

+0

예 동의하에, 나는이 물건을 손으로도한다. 게임 엔진/임베디드 작업/OS 루틴 및 RTOS 프로파일 링에 대한 합의는이 접근 방식을 사용한다. –

2

어셈블리 레벨의 성능 세부 사항을 제공 할 수있는 인텔의 VTune과 같은보다 강력한 프로파일 러를 사용할 수 있습니다.

http://software.intel.com/en-us/intel-vtune/

그것은 Windows 및 Linux 용,하지만 비용을 지불 않습니다 ...

+0

예, 그 트릭을 할 것입니다 - 이론에서 그렇습니다. 그 도구는 윈도우에서 끔찍하게 신뢰할 수 없습니다 - 그들은 BSOOD의 win2003과 XP에서 많은 기계를 주었고 다른 odities도 발생 시켰습니다. –

0

gcov를 사용하면 행 단위 실행 횟수를 줄 수 있습니다. 적어도 병목 현상이있는 인라인 함수를 알려 주어야합니다.

+0

나는 당신의 제안에 따라 gcov와 약간 놀았습니다. 그것은 많은 시간을들이는 것을 말해주기에 충분하지 않은 콜 카운트를 제공합니다. –