Namespaces
Variants

clock

From cppreference.net
헤더 파일에 정의됨 <time.h>
clock_t clock ( void ) ;

프로그램 실행과 관련된 구현에서 정의한 시점부터 프로세스가 사용한 대략적인 프로세서 시간을 반환합니다. 결과 값을 초 단위로 변환하려면 이를 CLOCKS_PER_SEC 로 나누십시오.

clock 에 대한 서로 다른 호출로 반환된 두 값의 차이만이 의미가 있습니다. 왜냐하면 clock 시대의 시작점이 프로그램의 시작과 일치할 필요는 없기 때문입니다.

clock 시간은 운영 체제가 프로그램에 부여하는 실행 리소스에 따라 벽시계보다 빠르거나 느리게 진행될 수 있습니다. 예를 들어, CPU가 다른 프로세스와 공유되는 경우, clock 시간은 벽시계보다 느리게 진행될 수 있습니다. 반면 현재 프로세스가 다중 스레드이고 둘 이상의 실행 코어를 사용할 수 있는 경우, clock 시간은 벽시계보다 빠르게 진행될 수 있습니다.

목차

반환값

프로그램이 지금까지 사용한 프로세서 시간.

  • 사용된 프로세서 시간을 사용할 수 없는 경우, ( clock_t ) ( - 1 ) 을 반환합니다.
  • 사용된 프로세서 시간의 값이 clock_t 로 표현될 수 없는 경우, 지정되지 않은 값을 반환합니다.

참고 사항

POSIX 호환 시스템에서는, clock_gettime 함수와 clock id CLOCK_PROCESS_CPUTIME_ID 를 사용하면 더 높은 해상도를 제공합니다.

clock() 함수가 반환하는 값은 일부 구현에서 순환(wrap around)할 수 있습니다. 예를 들어, 이러한 구현에서 clock_t 가 부호 있는 32비트 정수이고 CLOCKS_PER_SEC 1000000 인 경우, 약 2147초(약 36분) 후에 순환하게 됩니다.

예제

이 예제는 clock() 시간과 실제 시간 간의 차이를 보여줍니다.

#ifndef __STDC_NO_THREADS__
    #include <threads.h>
#else
    // POSIX alternative
    #define _POSIX_C_SOURCE 199309L
    #include <pthread.h>
#endif
#include <stdio.h>
#include <stdlib.h>
#include <time.h>
// the function f() does some time-consuming work
int f(void* thr_data) // return void* in POSIX
{
    (void) thr_data;
    volatile double d = 0;
    for (int n = 0; n < 10000; ++n)
       for (int m = 0; m < 10000; ++m)
           d += d * n * m;
    return 0;
}
int main(void)
{
    struct timespec ts1, tw1; // both C11 and POSIX
    clock_gettime(CLOCK_PROCESS_CPUTIME_ID, &ts1); // POSIX
    clock_gettime(CLOCK_MONOTONIC, &tw1); // POSIX; use timespec_get in C11
    clock_t t1 = clock();
#ifndef __STDC_NO_THREADS__
    thrd_t thr1, thr2;  // C11; use pthread_t in POSIX
    thrd_create(&thr1, f, NULL); // C11; use pthread_create in POSIX
    thrd_create(&thr2, f, NULL);
    thrd_join(thr1, NULL); // C11; use pthread_join in POSIX
    thrd_join(thr2, NULL);
#endif
    struct timespec ts2, tw2;
    clock_gettime(CLOCK_PROCESS_CPUTIME_ID, &ts2);
    clock_gettime(CLOCK_MONOTONIC, &tw2);
    clock_t t2 = clock();
    double dur = 1000.0 * (t2 - t1) / CLOCKS_PER_SEC;
    double posix_dur = 1000.0 * ts2.tv_sec + 1e-6 * ts2.tv_nsec
                           - (1000.0 * ts1.tv_sec + 1e-6 * ts1.tv_nsec);
    double posix_wall = 1000.0 * tw2.tv_sec + 1e-6 * tw2.tv_nsec
                            - (1000.0 * tw1.tv_sec + 1e-6 * tw1.tv_nsec);
    printf("CPU time used (per clock()): %.2f ms\n", dur);
    printf("CPU time used (per clock_gettime()): %.2f ms\n", posix_dur);
    printf("Wall time passed: %.2f ms\n", posix_wall);
}

가능한 출력:

CPU time used (per clock()): 1580.00 ms
CPU time used (per clock_gettime()): 1582.76 ms
Wall time passed: 792.13 ms

참고문헌

  • C17 표준 (ISO/IEC 9899:2018):
  • 7.27.2.1 clock 함수 (p: 285)
  • C11 표준 (ISO/IEC 9899:2011):
  • 7.27.2.1 clock 함수 (p: 389)
  • C99 표준 (ISO/IEC 9899:1999):
  • 7.23.2.1 clock 함수 (p: 339)
  • C89/C90 표준 (ISO/IEC 9899:1990):
  • 4.12.2.1 clock 함수

참고 항목

(C23에서 사용 중단됨) (C11)
time_t 객체를 텍스트 표현으로 변환
(함수)
epoch 이후 시간으로서 시스템의 현재 달력 시간을 반환
(함수)