[C++] 나노초(ns)단위 시간 측정 chrono 함수 사용법 & 예제

이전 포스팅에서 컴퓨터에서 정밀한 시간 측정방법과 C언어 / C++에서 측정된 시간을 clock, getTickcount, timeGetTime함수를 통해 사용할 수 있는 방법을 알아보았습니다. 하지만 이 함수들은 전부 밀리초까지만 측정이 가능하여 그 보다 더 정밀하게는 측정이 불가능하다는 단점이 있었습니다. 이러한 단점을 보완하고자 C++ 11부터 chrono 함수가 새롭게 추가되어 나노초까지 측정할 수 있게 되었습니다. 측정방식은 CPU의 클럭 기준 (3G CPU면 300만 분의 1)이라고 합니다.

[수학] 초 단위 종류 (극 미세 시간) + 변환 사이트

 

나노초 단위 측정이 필요한가?

사실 나노초 단위의 측정이 필요한지는 의문입니다. 기존의 밀리초 단위의 계측만으로도 충분하다는 생각때문입니다. 프로그램을 개발할 때 있어 이만큼의 정밀한 계측이 들어갈 필요성이 그다지 많지는 않아 보입니다. 그리고 당연한 말이겠지만 이렇게 해상도가 높은 측정 함수는 그만큼 CPU의 부하도 많이 걸리게 됩니다. 일반적인 상황이라면 기존의 계측 방법을 사용하도록 합시다. 아래 글을 참고해주세요.

[C언어/C++] 정밀한 시간 측정 (clock, getTickcount, timeGetTime) 함수의 차이와 사용법

 

나노초(ns)단위 시간 측정 chrono 함수 사용법 

#include <iostream>
#include <chrono>
using namespace std;
using namespace chrono;

void main()
{
    long sum = 0;
    system_clock::time_point start = system_clock::now();
    for (int i = 0; i < 1000000; i++) {
        sum += i;
    }
    system_clock::time_point end = system_clock::now();
    nanoseconds nano = end - start;

    cout << "경과시간(나노초 ns) : " << nano.count() << endl;
}

위의 예제와 같이 경과시간을 나노초로 나타낼 수 있습니다.

 

std::chrono::nanoseconds  // 나노 세컨드. 10억분의 1초
std::chrono::microseconds // 마이크로 세컨드. 100만분의 1초
std::chrono::milliseconds // 밀리 세컨드. 1000분의 1초
std::chrono::seconds // 초
std::chrono::minutes // 분
std::chrono::hours // 시

Defualt는 나노초로 되어있지만 나노초만으로 나타낼 수 있는 것은 아니고 위의 코드를 활용하여 상위 단위로 변환이 가능합니다.

 

#include <iostream>
#include <chrono>
using namespace std;

void main()

{
    long sum = 0;
    chrono::system_clock::time_point StartTime = chrono::system_clock::now();

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

    chrono::system_clock::time_point EndTime = chrono::system_clock::now();
    chrono::duration<double> DefaultSec = EndTime - StartTime;
    chrono::nanoseconds nano = EndTime - StartTime;
    chrono::microseconds micro = chrono::duration_cast<chrono::microseconds>(EndTime - StartTime);
    chrono::milliseconds mill = chrono::duration_cast<chrono::milliseconds>(EndTime - StartTime);
    chrono::seconds sec = chrono::duration_cast<chrono::seconds>(EndTime - StartTime);
    chrono::minutes min = chrono::duration_cast<chrono::minutes>(EndTime - StartTime);
    chrono::hours hour = chrono::duration_cast<chrono::hours>(EndTime - StartTime);
    cout << "for문 실행 시간(default) : " << DefaultSec.count() << endl;
    cout << "for문 실행 시간(nanoseconds) : " << nano.count() << endl;
    cout << "for문 실행 시간(microseconds) : " << micro.count() << endl;
    cout << "for문 실행 시간(milliseconds) : " << mill.count() << endl;
    cout << "for문 실행 시간(seconds) : " << sec.count() << endl;
    cout << "for문 실행 시간(minutes) : " << min.count() << endl;
    cout << "for문 실행 시간(hour) : " << hour.count() << endl;
}

코드 출처

jacking.tistory.com/988

댓글(0)

Designed by JB FACTORY