[C++11] 정밀한 시간 측정을 위한 chrono

하드웨어의 발전으로 보다 정밀한 시간을 측정할 수 있게 되었고, 이를 위해 C++11에서는 chrono를 제공합니다. chrono를 이용하여 측정한 시간값의 정밀도는 나노(nano, 0.000000001)초라고 합니다. 아래는 코드는 어떠한 연산에 대한 소요 시간을 측정하는 경우로써 chrono를 사용한 코드입니다.

#include "stdafx.h"
#include 
#include 

using namespace std;
using namespace chrono;

int _tmain(int argc, _TCHAR* argv[])
{
    system_clock::time_point tp1 = system_clock::now();
	
    double v = 0;
    for(long i = 0; i < 100000000; i++) {
        v += 0.1;
    }

    system_clock::time_point tp2 = system_clock::now();

    nanoseconds t = tp2 - tp1;
    cout << "nanoseconds: " << t.count() << endl;
    cout << "seconds: " << t.count() / 1000000000.0 << endl;

    return 0;
}

실행 시간을 측정한 연산에 대한 코드는 12번 ~ 15번입니다. 이 코드 부분의 앞뒤로 chrono를 이용하여 시간을 측정하고 있습니다. 측정된 시간의 차이(17번 코드)를 통해 연산에 소요되는 시간을 알 수 있습니다. 시간 차이에 대한 단위는 nano이며 이를 초(second)로 변환하기 위해 21번 코드처럼 1000000000값으로 나누어 출력하고 있습니다.

[C++11] std::tuple

tuple은 여러개를 하나의 것으로 묶은 것을 의미합니다. tuple이 C++11에 새롭게 도입되어 사용되는 가장 일반적인 형태는 함수의 반환값으로 사용입니다. 함수는 하나의 값 또는 객체만을 반환하는데 tuple을 사용하면 다수의 값 또는 객체들을 반환시킬 수 있습니다. 이에 대한 예제 코드는 아래와 같습니다.

#include "stdafx.h"
#include 
#include 
#include 

using namespace std;

tuple getSomething(double a, double b)
{
    return make_tuple(a+b, a/b, "Hello Tuple");
}

int _tmain(int argc, _TCHAR* argv[])
{
    auto r = getSomething(10.0, 20.0);

    cout << "Sum: " << get<0>(r) << endl;
    cout << "Div: " << get<1>(r) << endl;
    cout << "Msg: " << get<2>(r) << endl;

    return 0;
}

위의 코드 중 8번에 getSomething이라는 함수가 있습니다. 이 함수의 반환형이 tuple이고 double, double, string 템플릿 인자를 갖습니다. 즉, 이 tuple은 실수값 2개와 문자열값 1개로 구성되어 있다는 것이고 getSomething의 반환값은 실수값 2개와 문자열값 1개를 반환한다는 의미로 해석할 수 있습니다. 이 함수의 실제 호출은 15번 줄에서 이루어지는데요. 이 함수의 반환값인 tuple의 각 구성 요소에 접근하기 위해 std::get이라는 함수를 사용하며 이 std::get 함수의 사용 예가 바로 17번 ~ 19번 코드입니다.