programing

C: clock()을 사용하여 멀티 스레드 프로그램의 시간을 측정합니다.

randomtip 2022. 7. 14. 21:10
반응형

C: clock()을 사용하여 멀티 스레드 프로그램의 시간을 측정합니다.

저는 항상 clock()을 사용하여 응용 프로그램의 시작부터 종료까지 걸리는 시간을 측정해 왔습니다.

int main(int argc, char *argv[]) {
  const clock_t START = clock();

  // ...

  const double T_ELAPSED = (double)(clock() - START) / CLOCKS_PER_SEC;
}

POSIX 스레드를 사용하기 시작했기 때문에 실패할 것 같습니다.clock()은 N개의 스레드에서 N배 빠르게 증가합니다.몇 개의 스레드가 동시에 실행될지 모르기 때문에 이 접근법은 실패합니다.그러면 시간이 얼마나 지났는지 어떻게 측정할 수 있을까요?

clock()프로세스에서 사용되는 CPU 시간을 측정합니다.벽 클럭 시간이 아닙니다.여러 스레드를 동시에 실행하는 경우 CPU 시간을 훨씬 더 빨리 쓸 수 있습니다.

벽시계 실행 시간을 알고 싶다면 적절한 기능을 사용해야 합니다.ANSI C의 유일한 것은time()일반적으로 해상도는 1초밖에 되지 않습니다.

하지만 당신이 POSIX를 사용한다고 했듯이, 그것은 당신이 POSIX를 사용할 수 있다는 것을 의미한다.clock_gettime(), 로 정의되어 있습니다.time.h.그CLOCK_MONOTONIC특히 클럭을 사용하는 것이 가장 좋습니다.

struct timespec start, finish;
double elapsed;

clock_gettime(CLOCK_MONOTONIC, &start);

/* ... */

clock_gettime(CLOCK_MONOTONIC, &finish);

elapsed = (finish.tv_sec - start.tv_sec);
elapsed += (finish.tv_nsec - start.tv_nsec) / 1000000000.0;

(제가 계산한 것은elapsed매우 짧은 간격의 타이밍을 설정할 때 정밀도가 손실되지 않도록 주의하여 주십시오.

사용하시는 OS가 다음 기능을 제공하지 않는 경우CLOCK_MONOTONIC(실행시에 확인할 수 있습니다.sysconf(_SC_MONOTONIC_CLOCK))를 사용하여CLOCK_REALTIME폴백(fallback)으로 사용할 수 있지만 프로세스 실행 중에 시스템 시간이 변경되면 잘못된 결과가 생성된다는 단점이 있습니다.

어떤 타이밍 해결이 필요합니까?두 번째 해상도에는 time.h의 time()을 사용할 수 있습니다.고해상도가 필요한 경우는, 보다 시스템 고유의 것을 사용할 수 있습니다.C++사용하여 나노초 단위로 시간을 제공하는 타이머 기능을 참조하십시오.

언급URL : https://stackoverflow.com/questions/2962785/c-using-clock-to-measure-time-in-multi-threaded-programs

반응형