C에서 gettimeofday 함수 사용
이 기사에서는 C에서gettimeofday
함수를 사용하여 코드 블록에서 경과 시간을 계산하는 몇 가지 방법을 설명합니다.
gettimeofday
함수를 사용하여 C 코드 블록의 경과 시간 계산
gettimeofday
함수는 마이크로 초 정밀도까지 현재 시간을 검색하는 POSIX 호환 함수입니다. 이 함수는 두 개의 인수를 사용합니다. 하나는struct timeval
유형이고 다른 하나는struct timezone
입니다. 그러나timezone
구조가 감가 상각되었으며 대신NULL
값이 전달되어야합니다. 반면에timeval
구조에는tv_sec
및tv_usec
라는 두 개의 멤버가 포함되며 Epoch 이후 경과 된 초 및 마이크로 초 수를 나타냅니다. 다음 예제 코드는 단일 함수의 실행 시간 인loopFunc
를 측정하는 방법을 보여줍니다.
일반적으로, 우리는 두 번의gettimeofday
호출로 측정되어야하는 코드 블록을 둘러싸 야합니다. gettimeofday
에 대한 두 번째 호출이 성공적으로 반환되면 사용자 정의 함수 인time_diff
를 사용하여 시차를 계산할 수 있습니다. 두timeval
구조의 값을 가져 와서 차이를 초로 변환합니다.
#include <stdio.h>
#include <stdlib.h>
#include <sys/time.h>
#include <time.h>
#define NUM 1000000
#define NUM2 10000000
float time_diff(struct timeval *start, struct timeval *end) {
return (end->tv_sec - start->tv_sec) + 1e-6 * (end->tv_usec - start->tv_usec);
}
void loopFunc(size_t num) {
int tmp = 0;
for (int i = 0; i < num; ++i) {
tmp += 1;
}
}
int main() {
struct timeval start;
struct timeval end;
gettimeofday(&start, NULL);
loopFunc(NUM);
gettimeofday(&end, NULL);
printf("loopFunc(%d) time spent: %0.8f sec\n", NUM, time_diff(&start, &end));
gettimeofday(&start, NULL);
loopFunc(NUM2);
gettimeofday(&end, NULL);
printf("loopFunc(%d) time spent: %0.8f sec\n", NUM2, time_diff(&start, &end));
exit(EXIT_SUCCESS);
}
출력:
loopFunc(1000000) time spent: 0.00221000 sec
loopFunc(10000000) time spent: 0.02184500 sec
clock_gettime
함수를 사용하여 C 코드 블록의 경과 시간 계산
또는gettimeofday
가 한동안 사용되지 않는 것으로 표시되었으므로 대신clock_gettime
함수를 사용하는 것이 좋습니다. 후자의 기능은 첫 번째 매개 변수로 지정된 다른 클럭에서 타이밍 데이터를 검색 할 수 있습니다. 일반적인 시계 유형은 이른바 벽시계 시간을 측정하는 시스템 전체 시계이며CLOCK_REALTIME
매크로로 식별됩니다. 타이밍 값은timespec
구조에 저장되며, 이는 Epoch에서 전달 된 초 및 나노초 수를 나타내는 두 개의 멤버로 구성됩니다. 호출자는 사전에timespec
객체를 선언하고 해당 주소는clock_gettime
함수에 전달됩니다.
#include <stdio.h>
#include <stdlib.h>
#include <sys/time.h>
#include <time.h>
#define NUM 1000000
#define NUM2 10000000
float time_diff2(struct timespec *start, struct timespec *end) {
return (end->tv_sec - start->tv_sec) + 1e-9 * (end->tv_nsec - start->tv_nsec);
}
void loopFunc(size_t num) {
int tmp = 0;
for (int i = 0; i < num; ++i) {
tmp += 1;
}
}
int main() {
struct timespec start2;
struct timespec end2;
clock_gettime(CLOCK_REALTIME, &start2);
loopFunc(NUM);
clock_gettime(CLOCK_REALTIME, &end2);
printf("loopFunc(%d) time spent: %0.8f sec\n", NUM,
time_diff2(&start2, &end2));
clock_gettime(CLOCK_REALTIME, &start2);
loopFunc(NUM2);
clock_gettime(CLOCK_REALTIME, &end2);
printf("loopFunc(%d) time spent: %0.8f sec\n", NUM2,
time_diff2(&start2, &end2));
exit(EXIT_SUCCESS);
}
출력:
loopFunc(1000000) time spent: 0.00221000 sec
loopFunc(10000000) time spent: 0.02184500 sec
Founder of DelftStack.com. Jinku has worked in the robotics and automotive industries for over 8 years. He sharpened his coding skills when he needed to do the automatic testing, data collection from remote servers and report creation from the endurance test. He is from an electrical/electronics engineering background but has expanded his interest to embedded electronics, embedded programming and front-/back-end programming.
LinkedIn Facebook