2010-07-02 3 views
1

VC6에서 응용 프로그램을 프로파일 링하는 동안 다음 문제가 발생합니다. 나는 응용 프로그램을 프로파일 링 할 때, 프로파일은 다음과 유사한 간단한 게터 방법은 수백 번 수천을 호출되고 있음을 나타내는한다 :VC6 프로파일 러 문제 : 가짜 함수 호출

문제는,이 방법 테스트 어디서나 호출되지 않습니다되어

int SomeClass::getId() const 
{ 
    return m_iId; 
}; 
. 내가 다음 코드를 변경하는 경우 :

int SomeClass::getId() const 
{ 
    std::cout << "Is this method REALLY being called?" << std::endl; 
    return m_iId; 
}; 

프로파일 러는 결코 호출 함수 목록에서 getId 포함되지 않습니다. cout을 주석으로 처리하고 내가 시작한 곳으로 돌아가서, 130,000 개 이상의 전화를받습니다! 그냥 캐시 된 프로파일 러 데이터 나 손상된 함수 조회 테이블이 아니 었는지 확인하기 위해 각 테스트 사이를 정리하고 다시 작성합니다. 여전히 같은 결과!

아이디어가 있으십니까?

답변

3

필자는 컴파일러 및/또는 링커가 매우 간단한 함수를 하나 이상의 다른 함수와 '합체'한다고 생각합니다 (return m_iId에 대해 생성 된 코드는 같은 오프셋에있는 멤버를 반환하는 다른 getter).

본질적으로 동일한 기계 코드 구현을 갖는 여러 기능의 묶음은 모두 동일한 주소로 해석되어 프로파일 러를 혼동시킵니다.

최적화를 해제하여 문제가 발생하는 것을 막을 수 있습니다.

+0

알다시피, 나는 *이 문제가 내 문제의 원인 일 수 있다고 생각합니다.이상한 프로파일 링 정보가 사라지면 맵 파일이 문제라고 생각했지만, 다른 일부 getter가 직접 호출되지 않은 것을 발견했습니다. 최적화를 해제하면 적절한 이름이 표시됩니다. – acanaday

+0

VC6 프로파일 러가 pdb가 아닌 맵 파일을 사용하는 이유는 궁금합니다.하지만 필자는 그 당시에 그렇게했을 가능성이 높다고 생각했습니다. –

0

프로그램 시간을 단축하는 방법이 있는지 알아보기 위해 프로파일 링 중이라고 가정합니다. 당신은 숫자를보고 싶어하기 때문에 프로파일 링을하는 것이 아닙니다.

성능 문제를 찾는 데는 간단하고 구식이며 검증 된 방법이 있습니다. 프로그램이 실행되는 동안 "일시 중지"버튼을 누르고 통화 스택을 살펴보십시오. 5 번에서 20 번과 같이 여러 번하십시오. 문제가 커질수록 샘플을 찾을 필요가 줄어 듭니다.

일부 사람들은 이것이 기본적으로 프로파일 러가하는 것이 아닌지 묻습니다. 그 대답은 극소수입니다.

  • 일부 프로그램은 "핫 스폿"불필요한 시간을 보내고있다 : 그들은 모든 문제를 찾을 수 없기 때문에 당신의 속도 향상이 제한됩니다 결과에 Most profilers fall for one or more common myths. 이 경우 스택의 "끝"(프로그램 카운터가있는 곳)의 코드가 불필요한 작업을 수행하고 있음을 알 수 있습니다.

  • 일부 프로그램은 필요한 것보다 많은 I/O를 수행합니다. 그렇다면 I/O를 수행하는 과정에 있음을 알 수 있습니다.

  • 대용량 프로그램은 호출 트리가 불필요하게 얽히고 따라서 가지 치기가 필요하기 때문에 느린 경우가 많습니다. 그렇다면 불필요한 함수가 mid-stack을 호출하는 것을 볼 수 있습니다.

스택의 일부 비율에서 볼 수있는 코드는 제거하면 실행 시간 비율을 다소 절약 할 수 있습니다. 너는 잘못 갈 수 없어. Here's an example, 여러 번 반복하여 97 % 이상 절약 할 수 있습니다.