C에서 gettimeofday 함수 사용

Jinku Hu 2023년10월12일
  1. gettimeofday함수를 사용하여 C 코드 블록의 경과 시간 계산
  2. clock_gettime함수를 사용하여 C 코드 블록의 경과 시간 계산
C에서 gettimeofday 함수 사용

이 기사에서는 C에서gettimeofday함수를 사용하여 코드 블록에서 경과 시간을 계산하는 몇 가지 방법을 설명합니다.

gettimeofday함수를 사용하여 C 코드 블록의 경과 시간 계산

gettimeofday함수는 마이크로 초 정밀도까지 현재 시간을 검색하는 POSIX 호환 함수입니다. 이 함수는 두 개의 인수를 사용합니다. 하나는struct timeval유형이고 다른 하나는struct timezone입니다. 그러나timezone구조가 감가 상각되었으며 대신NULL값이 전달되어야합니다. 반면에timeval구조에는tv_sectv_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
작가: Jinku Hu
Jinku Hu avatar Jinku Hu avatar

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

관련 문장 - C Time