Dev/C, C++
빠른 localtime
newtype
2025. 12. 31. 15:58
원본: https://github.com/lmk/fast_localtime
고성능 KST(한국 표준시, UTC+9) 전용 localtime 구현
fastkst_localtime은 한국 표준시(KST, UTC+9) 변환에 최적화된 고성능 시간 변환 라이브러리입니다. 표준 localtime() 함수가 가진 성능 오버헤드를 제거하고, 64-bit 시간 값을 안전하게 처리할 수 있도록 설계되었습니다.
- glibc/time 소스를 참조하여 구현되었습니다.
- KST 타임존 변환에 특화되어 표준 localtime() 함수보다 빠른 성능 제공
- Linux 커널에서 발생하는 시스템 콜, timezone 조회, mutex 락 등의 오버헤드 제거
- 직접적인 시간 계산으로 최소한의 연산만 수행
- 2038년 문제 해결 (32-bit time_t 제약 극복)
- time_t 값 지원 범위: 약 -2920년 ~ +2920년
- struct tm의 tm_year 필드 제한: 약 -21만년 ~ +21만년 (int 타입 제한)
- 64-bit time_t를 안전하게 처리
- fastkst_localtime_safe() 함수로 멀티스레드 환경 지원
- 재진입 가능한 설계
- 경쟁 상태(race condition) 없이 안전한 동시 호출
- 시스템 타임존 설정과 무관하게 항상 KST(UTC+9) 반환
- 타임존 조회 오버헤드 제거
- 예측 가능하고 일관된 동작
int fastkst_localtime(time_t t, struct tm *tp)
주요 시간 변환 함수입니다.
매개변수:
- t: 변환할 Unix timestamp (time_t)
- tp: 결과를 저장할 struct tm 포인터
반환값:
- 1: 성공
- 0: 실패 (errno 설정됨)
지원 범위:
- 32-bit time_t: 1901-12-13 ~ 2038-01-19 (KST)
- 64-bit time_t: 약 -2920년 ~ +2920년
- 실제 제한: struct tm의 tm_year(int) 범위로 약 -21만년 ~ +21만년
int fastkst_localtime_safe(time_t t, struct tm *tp, int *err_code)
추가 검증 및 에러 처리 기능이 있는 Thread-safe 래퍼 함수입니다.
매개변수:
- t: 변환할 Unix timestamp (time_t)
- tp: 결과를 저장할 struct tm 포인터
- err_code: 에러 코드를 저장할 포인터 (NULL 가능)
반환값:
- 1: 성공
- 0: 실패 (err_code에 에러 코드 저장)
특징:
- struct tm 자동 초기화
- 명시적인 에러 코드 반환
- NULL 포인터 안전성 검증
#include <time.h>
#include <stdio.h>
// fastkst_localtime() 함수 선언
int fastkst_localtime(time_t t, struct tm *tp);
int main() {
time_t now = time(NULL);
struct tm kst_time;
if (fastkst_localtime(now, &kst_time) == 1) {
printf("현재 KST 시간: %04d-%02d-%02d %02d:%02d:%02d\n",
kst_time.tm_year + 1900,
kst_time.tm_mon + 1,
kst_time.tm_mday,
kst_time.tm_hour,
kst_time.tm_min,
kst_time.tm_sec);
}
return 0;
}
#include <time.h>
#include <stdio.h>
int fastkst_localtime_safe(time_t t, struct tm *tp, int *err_code);
int main() {
time_t now = time(NULL);
struct tm kst_time;
int error_code;
if (fastkst_localtime_safe(now, &kst_time, &error_code) == 1) {
printf("KST: %04d-%02d-%02d %02d:%02d:%02d %s\n",
kst_time.tm_year + 1900,
kst_time.tm_mon + 1,
kst_time.tm_mday,
kst_time.tm_hour,
kst_time.tm_min,
kst_time.tm_sec,
kst_time.tm_zone);
} else {
fprintf(stderr, "Error: %d\n", error_code);
}
return 0;
}
프로젝트에 fastkst_localtime.c를 포함하여 컴파일합니다:
gcc -c fastkst_localtime.c -o fastkst_localtime.o
gcc your_program.c fastkst_localtime.o -o your_program
테스트 코드를 포함하여 빌드하려면:
gcc -DTEST_FASTKST_LOCALTIME -o fastkst_localtime fastkst_localtime.c -lpthread
./fastkst_localtime
테스트 프로그램은 다음을 검증합니다:
- 기본 기능 테스트
- Unix Epoch (1970-01-01)
- 2038년 문제 (INT32_MAX)
- 미래 시간 (2100년, 3000년)
- 과거 시간 (1900년, 1969년)
- 성능 벤치마크
- localtime() vs fastkst_localtime() 성능 비교
- 100만회 반복 호출 측정
- 속도 향상률 계산 및 출력
- Thread Safety 테스트
- 10개 스레드 동시 실행
- 스레드당 1000회 반복
- 총 10,000회 동시 호출 검증
- NULL 포인터 테스트
- NULL 입력 처리 검증
- 적절한 에러 코드 반환 확인
fastkst_localtime()은 표준 localtime() 함수보다 일반적으로 빠른 성능을 보여줍니다:
- 타임존 조회 오버헤드 제거
- 시스템 콜 최소화
- mutex 락 제거
- 캐시 친화적인 메모리 접근 패턴
실제 성능은 시스템 환경에 따라 다를 수 있으며, 테스트 프로그램을 통해 확인할 수 있습니다.
- KST 전용: 이 라이브러리는 오직 KST(UTC+9) 타임존만 지원합니다. 다른 타임존이 필요한 경우 표준 localtime() 함수를 사용하세요.
환경 검증
$ date
2025. 12. 31. (수) 12:52:45 KST
$ timedatectl
Local time: 수 2025-12-31 12:52:54 KST
Universal time: 수 2025-12-31 03:52:54 UTC
RTC time: 수 2025-12-31 03:52:54
Time zone: Asia/Seoul (KST, +0900)
System clock synchronized: yes
NTP service: active
RTC in local TZ: no
$ ls -l /etc/localtime
lrwxrwxrwx. 1 root root 32 8월 25 2023 /etc/localtime -> ../usr/share/zoneinfo/Asia/Seoul
$ echo $TZ
$
- DST 미지원: 일광 절약 시간제(Daylight Saving Time)를 지원하지 않습니다. tm_isdst는 항상 0입니다.
- tm_year 범위: struct tm의 tm_year 필드가 int 타입이므로, 표현 가능한 연도 범위는 약 -21만년 ~ +21만년입니다.
함수 실패 시 다음 에러 코드가 설정됩니다:
- EINVAL: 잘못된 인자 (NULL 포인터)
- EOVERFLOW: 연도가 struct tm의 범위를 초과
반응형