2012-05-09 4 views
9

일부 코드를 실행하는 데 걸리는 시스템 시간을 측정하고 싶습니다. 이렇게하려면 ... 나는 샌드위치 두 통화 사이의 코드) (기능적으로 뒤 떨어지고 있다고 것 알지만, 예상치 못한 결과를 얻을 수getrusage()를 사용하여 C에서 시스템 시간 측정하기

#include <sys/time.h> 
#include <sys/resource.h> 
#include <unistd.h> 
#include <stdio.h> 

int main() { 
    struct rusage usage; 
    struct timeval start, end; 
    int i, j, k = 0; 

    getrusage(RUSAGE_SELF, &usage); 
    start = usage.ru_stime; 
    for (i = 0; i < 10000; i++) { 
    /* Double loop for more interesting results. */ 
    for (j = 0; j < 10000; j++) { 
     k += 20; 
    } 
    } 
    getrusage(RUSAGE_SELF, &usage); 
    end = usage.ru_stime; 

    printf("Started at: %ld.%lds\n", start.tv_sec, start.tv_usec); 
    printf("Ended at: %ld.%lds\n", end.tv_sec, end.tv_usec); 
    return 0; 
} 

내가하지만 슬프게도,이 두 개의 서로 다른 번호를 생산하고 희망! 나는()을 마우스 오른쪽은 getrusage를 사용하지

Started at: 0.1999s 
Ended at: 0.1999s 

암 : 내 컴퓨터가 두 번째 또는 두에 대한 생각 본 후,이 결과인가? 이 두 숫자가 다른 이유는 무엇입니까? 근본적으로 잘못된 것이라면 getrusage()를 사용하여 일부 소스 코드의 시스템 시간을 측정하는 또 다른 방법이 있습니까? 읽어 주셔서 감사합니다.

+1

'tv_usec '는 마이크로 초이므로 형식은'% lu. % 06u'이어야합니다. – Mapio

답변

9

"사용자"와 "시스템"시간의 차이를 오해하고 있습니다. 예제 코드는 측정하는 동안 주로 사용자 모드 (예 : 응용 프로그램 코드 실행)에서 실행되지만 "시스템"시간은 커널 모드 (즉, 시스템 호출 처리)에서 실행하는 데 걸리는 시간입니다.

ru_stime은 시스템 시간을 측정하기위한 올바른 필드입니다. 테스트 응용 프로그램은 사용자가 확인한 두 지점 사이에 그러한 시간이 발생하지 않도록합니다.

+1

고마워요! 내 교수님이 할 수있는 것보다 더 잘 설명 하셨 잖아요. –

2

사용 된 사용자 CPU 시간 인 usage.ru_utime을 사용해야합니다.

+0

이것은 실제로 더 바람직한 결과를 제공합니다. 그러나 나는 여전히 일부 코드의 시스템 시간을 측정하는 작업 방식을 찾아야 할 의무가있다. usage.ru_stime이 작동하지 않으면 그것을 어떻게 사용합니까? –

+1

프로그램이 커널 모드에서 실행되도록 설계된 경우'ru_stime'을 사용하십시오. 그렇지 않으면,'ru_utime'을 사용하십시오. – shinkou

+0

나는 cpu 시계와 함께'clock_gettime'을 사용할 것입니다 ... –

0

gprof를 사용하십시오. 이것은 각 기능에 걸리는 시간을 줄 것입니다. gprof를 설치하고 -pg -fprofile-arcs -ftest-coverage 컴파일에이 플래그를 사용하십시오.