2008-11-12 7 views

답변

5

필요로하지 않습니다 같은 호출 기능을 사용할 수 있습니다

#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()); 
+0

나는 이것을 좋아하지 만, 스택 덤프, 호출 주소, 반송 주소 등은 중요합니다. . 하나는 x로 정의 할 수 있습니다. 정상 작동을 위해. – EvilTeach

+0

예, 정확하게 말씀 드리지만 답변에 추가하는 것을 잊어 버렸습니다. 알림 주셔서 감사. –

3

프로파일 링 도구를 사용할 수없는 경우 프로필러에서 수행 한 작업을 에뮬레이션합니다. 흥미있는 것으로 생각하는 함수에 카운터를 삽입하고 호출 된 횟수/개수와 함께 잠재적으로 횟수를 계산합니다.

플랫폼의 타이머에 액세스 할 수있는 경우 코드의 내용이 명확하지 않으면 실행 시간 정보를 얻기 위해 해당 함수의 시작/끝 부분에서 시작/중지 할 수 있습니다. 이렇게하면 복잡한 코드에서 수익을 낼 수있는 가장 큰 장점이 생깁니다. 일반적으로 모든 기능을 수행 할 수있는 기능이 너무 많기 때문입니다. 대신 각 타이머에 전용 코드를 사용하여 특정 코드 섹션에서 소요 된 시간을 얻을 수 있습니다.

이 두 기술을 함께 사용하면 타이머를 사용하여 대부분의주기를 소비하는 코드의 광범위한 섹션을 발견 한 다음 개별 기능을 미세하게 세분화하여 문제를 해결할 수 있습니다.

2

기간이 충분히 길면 (예 : 1 분 이상) 디버거에서 소프트웨어를 실행 한 다음 몇 시간 휴식을 취하고 디버거가 고장 나는 곳을 확인하면 소프트웨어에 대한 대략적인 아이디어를 얻을 수 있습니다 최대 (예를 들어, 10 번 휴식을하고 모두 같은 장소에 있다면, 이것은 흥미로운 것을 알려줍니다!). 매우 거칠고 준비하지만 매우 유용한 다음 내가 발견 한 모든 도구, 장비 등

8

농담 없음 : std :: cout 및 기타 텍스트/데이터 지향 방식으로 타이밍을 덤프하는 것 외에 Beep() 함수도 사용합니다. 다른 종류의 인상을주는 두 개의 "경고음"체크 포인트 사이에 침묵의 차이를 듣는 것에 대해 뭔가가 있습니다.

서면 악보를보고 실제로 듣는 것의 차이점과 같습니다. 그것은 rgb (255,0,0)을 읽는 것과 fire-engine red를 보는 것의 차이와 같습니다.

지금, 나는 클라이언트/서버 응용 프로그램과 다른 주파수의 경고음을 사용하여 클라이언트가 메시지를 보내는 곳, 서버가 회신을 시작한 곳, 회신을 마친 곳, 회신이 처음 클라이언트에 들어오는 곳 등을 표시합니다. , 나는 자연스럽게 시간이 소비되는 곳을 느낄 수 있습니다.

+1

훌륭한 아이디어. –

+0

이 기술을 사용하여 생성자와 소멸자가 호출 될 때 표시합니다. – jeffythedragonslayer

+1

내 TRS80 모델로 돌아온 지 1 일만에 실시간 스타 트랙 게임을 작성한 친구가 있었고 키보드로 라디오를 켠 다음 코드에 몇 가지 특수 루프가있어 사운드 효과가 완전히 온다는 것을 알았습니다 라디오. – EvilTeach

1

나는 80/20 규칙을 사용하여 핫스팟 또는 흥미 호출 경로 주변에 타이머를 넣어 것입니다. 당신은 병목 수 (또는 실행 경로의 적어도 대부분) 및 해당 플랫폼을 따라 고해상도 타이머 (QueryPerformanceCounters, gettimeofday를, 등)를 사용하는 일반적인 생각을 가져야한다.

나는 보통 (필요하지 않은 경우) 잘 "초크 포인트"일반적으로 메시지 전달 또는 알고리즘 계산의 어떤 종류를 정의합니다 시작 또는 종료에 아무것도 신경 쓰지 않는다.일반적으로 메시지 싱크/srcs (moreso 싱크), 대기열, 뮤텍스 및 보통 혼란 (알고리즘, 루프)은 일반적으로 실행 경로의 대기 시간을 대부분 차지하는 것으로 나타났습니다.

+0

80/20 규칙에 동의합니다. 문제는 병목 현상이있는 곳을 추측 할 때 인간이 일반적으로 나쁘다는 것입니다. 그러나 20/80 규칙을 적용 할 수 있습니다. :) –

2

임베디드 마이크로 컨트롤러에서 어떤 플랫폼을 사용할 지 모르겠지만 여분의 디지털 출력 라인을 왜곡하고 오실로스코프, 카운터/타이머 또는 로직 분석기를 사용하여 펄스 폭을 측정하는 것이 도움이되는 경우가 있습니다.

1

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

/Gh 및/GH 스위치를 사용할 수 있습니다. Here's an example involving stack inspection

이 플래그를 사용하면 파일별로 파일을 기준으로 메소드가 입력 될 때마다 또는 런타임에 남아있는 선언되지 않은 함수를 등록 할 수 있습니다.

그런 다음 타이밍 정보가 아닌 모든 프로파일 링 정보를 등록 할 수 있습니다. 함수 X에서 사용 된 총 시간뿐만 아니라 '함수 X가 함수 Z에서 Y 시간 사용'을 알고 싶을 수 있기 때문에 중요합니다.