코드를 프로파일 링하는 데 사용할 수있는 기술을 사용할 수 있습니다

StackOverflow https://stackoverflow.com/questions/285710

문제

내가 개발 한 플랫폼 중 일부에는 프로파일 링 도구가 없습니다. 프로파일 러를 사용하지 않고 핫스팟을 식별하는 데 개인적으로 사용한 제안/기술을 찾고 있습니다.

대상 언어는 C ++입니다.

나는 당신이 개인적으로 사용했던 것에 관심이 있습니다.

도움이 되었습니까?

해결책

나는 다음과 같은 유용한 것을 발견했습니다.

#ifdef PROFILING
# define PROFILE_CALL(x) do{ \
    const DWORD t1 = timeGetTime(); \
    x; \
    const DWORD t2 = timeGetTime(); \
    std::cout << "Call to '" << #x << "' took " << (t2 - t1) << " ms.\n"; \
  }while(false)
#else
# define PROFILE_CALL(x) x
#endif

호출 함수에 사용할 수 있습니다.

PROFILE_CALL(renderSlow(world));
int r = 0;
PROFILE_CALL(r = readPacketSize());

다른 팁

농담 없음 : std :: cout 및 기타 텍스트/데이터 지향적 접근법에 타이밍을 덤핑하는 것 외에도 Beep () 함수도 사용합니다. 다른 인상을주는 두 "경고음"체크 포인트 사이의 침묵의 차이를 듣는 것에 관한 것이 있습니다.

그것은 쓴 악보를보고 실제로 음악을 듣는 것의 차이점과 같습니다. RGB (255,0,0)와 소방 엔진 레드를 보는 것의 차이와 같습니다.

그래서 지금은 클라이언트/서버 앱이 있고 다른 주파수가 다른 경고음으로 클라이언트가 메시지를 보내는 위치를 표시하고 서버가 답장을 시작하고 응답을 완료하고 회신이 먼저 클라이언트에 들어가는 등에는 매우 가능합니다. 당연히 시간이 소비되는 곳을 느끼십시오.

본질적으로 프로파일 링 도구를 사용할 수 없으면 프로파일 러가 한 일을 모방합니다. 당신은 당신이 생각하는 기능에 카운터를 삽입하고, 몇 번이나 몇 번이나, 어떤 크기/종류의 인수라고 부르는지 계산합니다.

플랫폼의 모든 타이머에 액세스 할 수있는 경우 해당 기능의 시작/끝에서 시작/중지하여 실행 시간 정보를 얻을 수 있습니다. 이것은 당신에게 복잡한 코드에서 당신의 벅에 대한 가장 큰 강타를 줄 것입니다. 일반적으로 그들 모두를 도구하기에 너무 많은 기능이 있기 때문입니다. 대신, 타이머를 각각의 코드에 전념하여 특정 코드 섹션에서 소비 된 시간을 얻을 수 있습니다.

탠덤 의이 두 가지 기술은 반복적 인 접근 방식을 형성 할 수 있으며, 여기서 타이머를 사용하여 대부분의주기를 소비하는 광범위한 코드 섹션을 찾은 다음, 더 미세한 세분성으로 개별 기능을 문제에 연마 할 수 있습니다.

충분히 긴 시간이 길면 (예 : 1 분 이상), 디버거에서 소프트웨어를 실행 한 다음 몇 번 끊어서 디버거가 어디에서 파괴되는지 확인하면 소프트웨어가 무엇인지에 대한 매우 대략적인 아이디어를 제공합니다. 당신이 10 번을 끊고 그들이 모두 같은 장소에 있다면, 이것은 당신에게 흥미로운 것을 알려줍니다!). 매우 거칠고 준비되었지만 도구, 계측 등이 필요하지 않습니다.

어떤 플랫폼이 생각했는지 잘 모르겠지만, 임베디드 마이크로 컨트롤러에서는 오실로스코프, 카운터/타이머 또는 논리 분석기를 사용하여 여분의 디지털 출력 라인을 비틀고 펄스 폭을 측정하는 것이 도움이됩니다.

나는 80/20 규칙을 사용하고 핫스팟이나 흥미로운 통화 경로 주위에 타이머를 넣을 것입니다. 병목 현상이 어디에 있는지 (또는 적어도 대부분의 실행 경로) 어디에 있습니까? 적절한 플랫폼 의존성 고해상도 타이머 (QueryPerformancecounters, gettimeofday 등)를 사용해야합니다.

나는 일반적으로 시작 또는 종료시 (필요하지 않은 경우) 아무것도 신경 쓰지 않으며 "초크 포인트", 일반적으로 메시지 전달 또는 일종의 알고리즘 계산을 잘 정의합니다. 일반적으로 메시지 싱크/SRC (Sinks Moreso), 대기열, 뮤 테스 및 평범한 엉망 (알고리즘, 루프)은 일반적으로 실행 경로에서 대부분의 대기 시간을 설명한다는 것을 알았습니다.

Visual Studio를 사용하고 있습니까?

/GH 및 /GH 스위치를 사용할 수 있습니다. 스택 검사와 관련된 예는 다음과 같습니다

이 플래그를 사용하면 파일별로 파일별로 메소드가 입력 및/또는 런타임에 남아있을 때마다 호출되는 미색 기능을 등록 할 수 있습니다.

그런 다음 타이밍 정보뿐만 아니라 프로파일 링 정보의 모든 시간을 등록 할 수 있습니다. 스택 덤프, 호출 주소, 반환 주소 등. 중요한 것은 '함수 X가 함수 z에서 y 시간을 사용했으며'기능 X에 소비 된 총 시간이 아니라는 것을 알고 싶을 수 있기 때문입니다.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top