chrono

  • C++11에서 추가된 시간 관련 라이브러리

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로 같은 수열 생성 가능

Categories: ,

Updated: