[C++]C++11, rvalue reference에 대한 성능측정

  • 이 당시 왜 이렇게 했었는지 기억이 1도 안난다.

intro

  • C++11 에서 RValue Reference 사용으로 인항 성능 향상이 있다고 해서 몇몇가지 테스트를 해봄
  • 몇차례 수행 후 평균값을 내었고, 테스트 환경(여러가지가 돌고있어서 결과값은 상대적으로 봐야할듯)은 아래처럼
  • 실행PC 사양
    프로세서: intel(R) Core(TM) i5-2400 CPU @ 3.10GHz 
    설치된 메모리 4.00GB
    시스템 종류: 32비트 운영 체제
    

test

#include <iostream>
#include <windows.h>
#include <list>
#include <vector>
#include <queue>
#include <string>
long long counter() {
    LARGE_INTEGER li;
    QueryPerformanceCounter(&li);
    return li.QuadPart;
}
long long get_frequency() {
    LARGE_INTEGER li;
    QueryPerformanceFrequency(&li);
    return li.QuadPart;
}

// to confine the test to run on a single processor in order to get consistent results for all tests.
void perf_startup() {
    SetThreadAffinityMask(GetCurrentThread(), 1);
    SetThreadIdealProcessor(GetCurrentThread(), 0);
    Sleep(1);
}
 
void test_rvalue_reference(int count)
{
    std::cout << "----------test_rvalue_reference----------" << std::endl;
 
    long long frequency = get_frequency();
    long long start = 0;
    long long finish = 0;
    double total = 0;
    int temp = 0;
 
    //case1
    {
        start = counter();
 
        for (int i = 0; i < count; i++)
        {
            std::string msg1("Hello world !");
            std::string msg2("Hello world !");
            std::string msg3("Hello world !");
 
            std::string output = msg1 + " " + msg2 + " " + msg3;
            temp += output.size();
        }
        finish = counter();
        total = ((finish - start)*1.0 / frequency);
        printf("test_rvalue_reference1: \t%f sec, %d\n", total, temp);
 
    }
 
    //case2
    {
        long long total_copy_move_count = 0;
        long long total_vector_resizes = 0;
        double total_pushback_time = 0.0;
 
        std::vector<std::string> v_str;
 
        start = counter();
 
        for (int i = 0; i<count; ++i)
        {
            size_t size = v_str.size();
            size_t capacity = v_str.capacity();
            v_str.push_back("hello world!");
 
            // indication that vector reallocation has occurred.
            if(size == capacity) 
            {
                ++total_vector_resizes;
                total_copy_move_count += size;
            }
        }
        finish = counter();
        total = ((finish - start)*1.0 / frequency);
        printf("test_rvalue_reference2: \t%f sec, %lld, %lld\n", total, total_vector_resizes, total_copy_move_count);
     }
}
 
int main(void)
{
    test_rvalue_reference(100000);
    test_rvalue_reference(200000);
    test_rvalue_reference(300000);
    return 1;
}

실행결과

  • 성능차이가 예상보다..
  case1 case2
VS2008 (100000번) 0.715383 sec 0.024797 sec
VS2008 (200000번) 1.416200 sec 0.042661 sec
VS2008 (300000번) 2.123057 sec 0.063813 sec
VS2013 (100000번) 0.122426 sec 0.008985 sec
VS2013 (100000번) 0.236044 sec 0.013602 sec
VS2013 (100000번) 0.354466 sec 0.020742 sec