ttime / chrono.now

June 10, 2026 · View on GitHub

헤더 ttime.h에 정의되어 있습니다. (#include "opencstl.h"를 통해 함께 포함됩니다.)

double ttime(void);

typedef double (*ttime_func)(void);

typedef struct CHRONO {
    ttime_func now;
} CHRONO;

static CHRONO chrono = {
    ttime,
};

ttime()chrono.now()는 현재 타이머 값을 double로 반환하는 간단한 타이머 API입니다. 두 API 모두 반환 단위는 밀리초(ms) 이며, 실행 시간 측정은 보통 시작 시각과 종료 시각의 차이를 계산해 사용합니다.

double t0 = ttime();

// 측정할 작업

double t1 = ttime();
printf("elapsed: %.3f ms\n", t1 - t0);

목차

  1. API 개요
  2. ttime
  3. chrono.now
  4. 두 API의 차이
  5. 플랫폼별 동작
  6. 예제
  7. 참고 사항

API 개요

API형태반환 타입단위용도
ttime()함수doublems직접 타이머 호출
chrono.now()함수 포인터 호출doublems함수 테이블 스타일 타이머 호출

chrono.now()는 내부적으로 ttime을 가리킵니다. 따라서 현재 구현에서 두 API는 같은 값을 같은 단위로 반환합니다.

double a = ttime();
double b = chrono.now();

ttime

double ttime(void);

현재 타이머 값을 밀리초 단위로 반환합니다. 반환값의 절대값 자체보다는, 같은 프로그램 안에서 두 번 호출한 값의 차이를 이용해 경과 시간을 구하는 용도로 사용합니다.

항목내용
반환값현재 타이머 값
반환 타입double
단위밀리초(ms)
인자없음
복잡도상수 O(1)
double start = ttime();

for (int i = 0; i < 1000000; i++) {
    // workload
}

double end = ttime();
printf("duration: %.3f ms\n", end - start);

chrono.now

호출 형태:

double value = chrono.now();

chrono.now()CHRONO 구조체의 함수 포인터 now를 호출하는 형태입니다. OpenCSTL의 일부 API가 사용하는 함수 테이블 스타일과 비슷하게, 타이머를 객체처럼 호출하고 싶을 때 사용할 수 있습니다.

double start = chrono.now();

// 측정할 작업

double end = chrono.now();
printf("duration: %.3f ms\n", end - start);

구조는 다음과 같습니다.

typedef struct CHRONO {
    ttime_func now;
} CHRONO;

static CHRONO chrono = {
    ttime,
};

즉, chrono.now()는 현재 구현에서 ttime()과 동일한 함수 호출입니다.


두 API의 차이

ttime()chrono.now()의 시간 단위 차이는 없습니다. 둘 다 double 타입의 밀리초(ms) 값을 반환합니다.

실질적인 차이는 호출 스타일입니다.

항목ttime()chrono.now()
호출 방식직접 함수 호출chrono 구조체의 함수 포인터 호출
반환 단위msms
내부 구현플랫폼별 타이머 호출ttime을 가리키는 래퍼
권장 사용처간단한 측정 코드함수 테이블 스타일을 선호하는 코드

경과 시간은 두 API 중 하나를 일관되게 사용해 아래처럼 계산합니다.

double elapsed_ms = end - start;

elapsed_ms밀리초(ms) 단위입니다.


플랫폼별 동작

OpenCSTL은 플랫폼에 따라 다른 시스템 타이머를 사용합니다.

플랫폼내부 API반환값 계산
WindowsQueryPerformanceCounter / QueryPerformanceFrequency카운터 값을 ms로 변환
POSIX 계열gettimeofday초와 마이크로초를 ms로 변환

Windows에서는 고해상도 성능 카운터 값을 사용하므로 반환값의 기준점은 플랫폼이 정한 임의의 시점입니다. POSIX 계열에서는 gettimeofday 기반으로 초(tv_sec)와 마이크로초(tv_usec)를 밀리초로 변환합니다.

따라서 반환값의 절대값에 의미를 두기보다, 같은 실행 흐름 안에서 얻은 두 값의 차이를 경과 시간으로 사용하는 것이 안전합니다.


예제

ttime으로 측정

#include "opencstl.h"

#include <stdio.h>

int main(void) {
    double t0 = ttime();

    for (int i = 0; i < 1000000; i++) {
        // workload
    }

    double t1 = ttime();
    printf("elapsed: %.3f ms\n", t1 - t0);
    return 0;
}

chrono.now로 측정

#include "opencstl.h"

#include <stdio.h>

int main(void) {
    double t0 = chrono.now();

    for (int i = 0; i < 1000000; i++) {
        // workload
    }

    double t1 = chrono.now();
    printf("elapsed: %.3f ms\n", t1 - t0);
    return 0;
}

참고 사항

  • ttime()chrono.now()는 메모리를 할당하지 않으며 destroy가 필요 없습니다.
  • 반환값은 double이므로 출력할 때는 %f, %.2f, %.3f 등을 사용합니다.
  • 실행 시간 측정에서는 startend를 같은 API로 받는 것이 가장 명확합니다.
  • POSIX 계열 구현은 gettimeofday 기반이므로 시스템 시간이 조정되면 측정값에 영향을 받을 수 있습니다.