C에서 내 프로그램 섹션의 실행 시간을 어떻게 찾을 수 있습니까?
문제
나는 C 코드 섹션의 실행 시간을 얻는 방법을 찾으려고 노력하고있다. 나는 이미 time.h에서 time ()와 clock ()를 모두 시도했지만 시간 ()가 몇 초이고 시계를 반환하는 것 같습니다. ()는 나에게 밀리 초 (또는 센티스 초)를주는 것 같습니다.하지만 더 정확한 것을 원합니다. 적어도 마이크로 초 정밀도로 시간을 잡을 수있는 방법이 있습니까?
이것은 Linux에서 컴파일 할 수 있어야합니다.
해결책
당신은 언급했습니다 clock()
그리고 time()
- 당신은 찾고 있었습니까? gettimeofday()
? 그것은 채워질 것입니다 struct timeval
, 초와 마이크로 초를 포함합니다.
물론 실제 해상도는 하드웨어에 달려 있습니다.
다른 팁
가치가있는 것은 여기에 몇 가지 매크로가 있습니다.
#include <time.h>
clock_t startm, stopm;
#define START if ( (startm = clock()) == -1) {printf("Error calling clock");exit(1);}
#define STOP if ( (stopm = clock()) == -1) {printf("Error calling clock");exit(1);}
#define PRINTTIME printf( "%6.3f seconds used by the processor.", ((double)stopm-startm)/CLOCKS_PER_SEC);
그런 다음 다음과 같이 사용하십시오.
main() {
START;
// Do stuff you want to time
STOP;
PRINTTIME;
}
당신은 원합니다 프로파일 러 신청.
So 및 Search Engines에서 키워드 검색 : Linux 프로파일 링
살펴보십시오 gettimeofday, 시계_*, 또는 get/setitimer.
노력하다 "Bench.h"; start_timer를 넣을 수 있습니다. 및 stop_timer ( "이름"); 코드에 따라 코드의 모든 섹션 섹션을 임의로 벤치마킹 할 수 있습니다 (참고 : 수십 밀리 초 이상을 취하는 것이 아니라 짧은 섹션에만 권장됩니다). 클록 사이클에 정확하지만 일부 드문 경우에는 사이의 코드가 컴파일되는 방식을 변경할 수 있습니다.이 경우 프로파일 러가 더 좋습니다 (프로파일 러는 일반적으로 특정 코드 섹션에 사용하기 위해 더 많은 노력을 기울입니다).
x86에서만 작동합니다.
Google을 원할 수도 있습니다 수단 도구.
플랫폼의 시계 해상도를 지나갈 수있는 라이브러리 호출을 찾을 수 없습니다. 다른 포스터가 제안한대로 프로파일 러 (Man GPROF)를 사용하거나, 빠른 & 더러운 - 코드의 문제 섹션 주위에 루프를 넣고 여러 번 실행하고 Clock ()를 사용하십시오.
gettimeofday()
마이크로 초의 해상도를 제공합니다 clock_gettime()
나노 초의 해상도를 제공합니다.
int clock_gettime(clockid_t clk_id, struct timespec *tp);
그만큼 clk_id
사용할 시계를 식별합니다. 사용 CLOCK_REALTIME
모든 프로세스에 시스템 전체의 시계를 보려면. 사용 CLOCK_PROCESS_CPUTIME_ID
프로세스 당 타이머 및 CLOCK_THREAD_CPUTIME_ID
스레드 별 타이머의 경우.
그것은 조건에 따라 다릅니다. 프로파일 러는 일반적인 글로벌 관점에 좋지만 실제로 정확한 견해가 필요하다면 내 추천은 키스입니다. 완료하는 데 1 분 정도 걸리도록 루프로 코드를 실행하기 만하면됩니다. 그런 다음 총 실행 시간과 반복을 실행 한 간단한 평균을 계산합니다.
이 접근법은 다음을 수행 할 수 있습니다.
저해상도 타이머로 정확한 결과를 얻으십시오.
계측기가 프로세서에 가까운 고속 캐시 (L2, L1, Branch..ETC)를 방해하는 문제는 발생하지 않습니다. 그러나 단단한 루프로 동일한 코드를 실행하면 실제 조건을 반영하지 않는 낙관적 인 결과를 제공 할 수 있습니다.
어떤 Enviroment/OS를 진행하고 있는지 알지 못하지만 다른 스레드, 작업 또는 프로세스가 중간에 타임 코드를 선점하면 타이밍이 부정확 할 수 있습니다. 다른 스레드가 프로세스를 예약하는 것을 방지하기 위해 뮤 테스 또는 세마포어와 같은 메커니즘을 탐색하는 것이 좋습니다.
x86 또는 x64에서 개발중인 경우 타임 스탬프 카운터를 사용하지 않겠습니까? RDTSC.
rdtsc가 원자 함수이므로 시간 () 또는 clock ()과 같은 ANSI C 기능보다 더 신뢰할 수 있습니다. 이 목적을 위해 C 함수를 사용하면 문제가 발생할 수 있으므로 실행중인 스레드가 전환되지 않을 것이라는 보장이 없으므로 결과적으로 반환 값은 측정하려는 실제 실행 시간에 대한 정확한 설명이 아닙니다. .
RDTSC를 사용하면 더 잘 측정 할 수 있습니다. 진드기 수를 인간 읽기 쉬운 시간으로 다시 변환해야합니다.
그러나 RDTSC를 사용하더라도 코드가 실행에서 전환 된 시간을 포함 할 수 있으며 Time ()/clock ()를 사용하는 것보다 더 나은 솔루션이 필요하면 정확한 측정이 필요한 경우 코드를 도구로 만드는 프로파일 러로 전환해야합니다. 컨텍스트 스위치 또는 그 밖의 무엇보다도 코드가 실제로 실행되지 않을 때 고려하십시오.