C에서 내 프로그램 섹션의 실행 시간을 어떻게 찾을 수 있습니까?

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

  •  05-07-2019
  •  | 
  •  

문제

나는 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;
}

에서 http://ctips.pbwiki.com/timer

당신은 원합니다 프로파일 러 신청.

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 분 정도 걸리도록 루프로 코드를 실행하기 만하면됩니다. 그런 다음 총 실행 시간과 반복을 실행 한 간단한 평균을 계산합니다.

이 접근법은 다음을 수행 할 수 있습니다.

  1. 저해상도 타이머로 정확한 결과를 얻으십시오.

  2. 계측기가 프로세서에 가까운 고속 캐시 (L2, L1, Branch..ETC)를 방해하는 문제는 발생하지 않습니다. 그러나 단단한 루프로 동일한 코드를 실행하면 실제 조건을 반영하지 않는 낙관적 인 결과를 제공 할 수 있습니다.

어떤 Enviroment/OS를 진행하고 있는지 알지 못하지만 다른 스레드, 작업 또는 프로세스가 중간에 타임 코드를 선점하면 타이밍이 부정확 할 수 있습니다. 다른 스레드가 프로세스를 예약하는 것을 방지하기 위해 뮤 테스 또는 세마포어와 같은 메커니즘을 탐색하는 것이 좋습니다.

x86 또는 x64에서 개발중인 경우 타임 스탬프 카운터를 사용하지 않겠습니까? RDTSC.

rdtsc가 원자 함수이므로 시간 () 또는 clock ()과 같은 ANSI C 기능보다 더 신뢰할 수 있습니다. 이 목적을 위해 C 함수를 사용하면 문제가 발생할 수 있으므로 실행중인 스레드가 전환되지 않을 것이라는 보장이 없으므로 결과적으로 반환 값은 측정하려는 실제 실행 시간에 대한 정확한 설명이 아닙니다. .

RDTSC를 사용하면 더 잘 측정 할 수 있습니다. 진드기 수를 인간 읽기 쉬운 시간으로 다시 변환해야합니다.

그러나 RDTSC를 사용하더라도 코드가 실행에서 전환 된 시간을 포함 할 수 있으며 Time ()/clock ()를 사용하는 것보다 더 나은 솔루션이 필요하면 정확한 측정이 필요한 경우 코드를 도구로 만드는 프로파일 러로 전환해야합니다. 컨텍스트 스위치 또는 그 밖의 무엇보다도 코드가 실제로 실행되지 않을 때 고려하십시오.

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