chrono
1. Duration
// 1. 스레드 대기시간 지정
std::this_thread::sleep_for(std::chrono::seconds(2)); // 2초 대기
// 2. 시간 계산
auto total_time = std::chrono::seconds(10) + std::chrono::milliseconds(500); // 10.5초
- 시간 간격을 나타내며, 숫자와 시간 단위로 구성
- std::chrono::seconds, std::chrono::milliseconds, std::chrono::nanoseconds 등
2. Time Point
// 현재 시간 저장
auto now = std::chrono::system_clock::now();
- 특정 시간을 나타내며, 기준점(epoch)으로부터의 duration으로 표현
- std::chrono::system_clock::time_point 등
3. Clock
auto start = std::chrono::high_resolution_clock::now();
// 작업 수행...
auto end = std::chrono::high_resolution_clock::now();
auto elapsed = std::chrono::duration_cast<std::chrono::milliseconds>(end - start); // 시간 차 연산
- 시간을 측정하는 메커니즘
- system_clock, steady_clock, high_resolution_clock 등
ctime과의 차이
|
ctime |
chrono |
이식성 |
플랫폼 별로 발생하는 차이 |
플랫폼 독립적, 표준화됨 |
안전성 |
스레드 안전하지 않음 (gmtime, localtime 등) |
대부분 연산이 스레드 안전함 |
타입 안전성 |
C 스타일, 단위 혼동 가능 |
컴파일 타임 단위 검사, 타입 안전 |
표현력 |
코드만으로 단위 파악 어려움 |
코드에서 시간 단위가 명확 |
메모리 관리 |
전역 정적 버퍼 사용 (위험) |
RAII 패턴, 안전한 객체 관리 |
API 스타일 |
C 스타일 함수 |
현대적 C++ 객체 지향 설계 |
시간 연산 |
수동 계산 필요, 오류 발생 쉬움 |
직관적 연산자 오버로딩 지원 |
사용 권장도 |
레거시 코드에서만 |
C++11 이후 권장되는 표준 방식 |
seed rand
srand((unsigned int)time(nullptr));
int num = rand() % 100 + 1;
- 위는 기존의 rand를 사용하기 전 srand를 하던 방법이다
auto seed = std::chrono::high_resolution_clock::now().time_since_epoch().count();
srand(static_cast<unsigned int>(seed));
- 기존 방법에 chrono만 적용하면 위와 같이 작성할 수 있다
std::random_device rd; // 하드웨어 기반 랜덤 수 생성 (srand 역할)
std::mt19937 gen(rd()); // 의사 난수 생성 알고리즘
std::uniform_int_distribution<> dis(1, 100); // 균등 분포의 특정 랜덤한 수를 뽑도록 설정
int num = dis(gen); // 실제 난수 생성
- 이것이 가장 권장되는 방법이라 한다
- 더 좋은 품질: mt19937이 rand()보다 훨씬 좋은 난수 생성
- 균등한 분포: uniform_distribution이 진짜 균등한 분포 보장
- 타입 안전성: 템플릿 기반으로 타입 안전
- 재현 가능성: 같은 seed로 같은 수열 생성 가능