2012-12-31 3 views
0

간단히 말해서 CPU 사용량이 많은 앱을 완전히 다른 방식으로 재구성하고 내부 동작을 많이 변경하려고합니다. 나는 옛 것과 새로운 결과를 비교할 좋은 방법을 찾고 있었다.특정 기능에 대한 새로운/오래된 코드의 CPU 사용량 측정

내가 60 초, 말의 프로그램 실행이 있고, 기능은 프로그램의 총 CPU 사용량 내에서 사용하는 CPU의 %를 측정하려면 :

내가 어떻게 기능 foo() 작품 변경하여 시작하는 말. 25 %가 일정하다면, 그 중 25 %가 내 기능인지 알기를 원합니다. 그런 다음 코드를 변경 한 후에 테스트하고 좋은 개선 여부를 나타내는 두 가지 좋은 지표가 있습니다.

나는 Very Sleepy을 시도했지만 액세스하려는 기능에 액세스 할 수 없습니다. 그들은 보여주지 않는다. 나는 라이브러리 함수 (SDL)를 사용하는 자신이 사용한 함수의 % 사용량을 볼 수 있기를 원하지만 SDL 함수 만 보여줄 것입니다.

+1

작동중인 OS에 태그를 지정하십시오. –

+0

이미 다른 사람이 작성 했으므로 잘 부탁드립니다. – GigaBass

답변

3

여러 가지 방법이 있습니다. 그 중 하나는 단순히 함수의 시작과 끝에서 고정밀 타이머 호출을 추가하는 것입니다. 함수 호출 횟수에 따라 시간을 누적 할 수 있습니다 (예 :

typedef type_of_time_source tt; 
tt total = 0; 

void my_func(....) 
{ 
    tt time = gettime(); 

    ... lots of your code ... 

    time = gettime() - time; 
    total += time; 
} 

) 또는 개별 간격을 저장할 수 있습니다.

tt array[LARGE_NUMBER]; 
int index = 0; 


... same code as above ... 
    time = gettime() - time; 
    if (index >= LARGE_NUMBER) index = 0; // [or LARGE_NUMBER-1?] 
    array[index++] = time; 

SDL에 대한 호출이 함수의 중간에있는 경우 당연히 그 시간이나 다른 할인가가 필요합니다. 그렇지 않은 경우, 나는 확실히 모든 기능을 사용했습니다, 그리고 장기 실행 기능으로 합리적으로 큰

enum { 
    FUNCA, 
    FUNCB, 
    .... 
    MAX_TIMINGS 
} 

struct timing_val 
{ 
    tt start, end; 
    char *name; 
} 
struct timing_val timing_values[MAX_TIMINGS]; 

#define START(f) do { timing_values[f].name = #f; timing_values[f].start = gettime(); } while (0); 
#define END(f) do { timing_values[f].end = gettime(); } while(0); 

void report() 
{ 
    for(int i = 0; i < MAX_TIMING; i++) 
    { 
      if (timing_values[i].start == 0 && timing_vlaues[i].end 
       cout << timing_values[i].name <<< " time = " << 
        timing_values[i].end - timing_values[i].start << endl; 
    } 
} 

void big_function() 
{ 
    START(FUNCA); 
    funca(); 
    END(FUNCA); 
    START(FUNCB); 
    funcb(); 
    END(FUNCB) 

    ... 

    report(); 
} 

:

또 다른 방법은 여러 가지 기능의 개별 타이밍을 측정하는 것 많은 오버 헤드를 추가합니다.

여러 기능을 동시에 측정 할 수도 있습니다. 우리가 전체 기능을 원한다면 위의 열거 형 목록에 "BIG_FUNC"열거 형을 추가하면됩니다.

void big_function() 
{ 
    START(BIG_FUNCTION); 
    START(FUNCA); 
    funca(); 
    END(FUNCA); 
    START(FUNCB); 
    funcb(); 
    END(FUNCB) 

    ... 
    END(BIG_FUNCTION); 
    report(); 
} 
+0

감사합니다. 그리고 프로그램 자체에 비해 1 (또는 여러) 함수의 시간을 측정하려면 어떻게해야합니까? 일종의 준 정밀도 값을 얻으려면? 프로그램 시작과 동시에 타이머를 추가해야합니까? 프로그램 종료시 타이머를 닫은 다음 functionTime/programTime x 100을 수행합니까? 나는 또한 프로그램 전체에서 잠을 자고 있기 때문에 방해하지 않습니까? – GigaBass

+0

나는 일반적으로 유닉스 명령 "시간"또는 일부 그런 시간 (시간은 사용자와 커널 모드에서 실시간 및 CPU 시간으로 총 시간을 제공하므로이를 측정하는 것이 일반적이므로 측정 시간에 대해서는 걱정하지 않는다. 전체 시간 계산). 편집을 통해 위의 또 다른 작은 트릭을 보여 드리겠습니다 ... –

+0

다시 한 번 고맙습니다. 좋은 새해를 보내라! :) – GigaBass