본문 바로가기

Programming/C & C++

[C++] C++ 속도 측정 및 비교 모듈

내가 만든 알고리즘의 속도를 측정하거나 무엇이 더 좋은 성능을 보이는지 비교하고 싶을 때가 있습니다. 시간 측정 자체는 간단히 구현할 수 있지만, 그때마다 매번 만드는 것이 귀찮기도 하고 여러 코드 블록들을 한 번에 비교할 수 있으면 편할 것 같아서 직접 클래스로 만들어 보았습니다.

 

소요 시간 측정에는 chrono 라이브러리를 이용했습니다. 이를 이용하면 최대 나노초(nanosecond) 단위의 정밀한 시간 측정이 가능합니다.

#include "PerformanceBenchmark.hpp"

#include <iostream>
#include <unordered_map>

using namespace std;

void codeBlock1()
{
    unordered_map<string, int> data;
    bool isKeyExist;

    data["Test 1"] = 10;
    data["Test 2"] = 30;
    data["Test 3"] = 15;

    for (int i = 0; i < 10000; i++) {
        isKeyExist = data.find("Test 2") != data.end();
    }
}

void codeBlock2()
{
    unordered_map<string, int> data;
    bool isKeyExist;

    data["Test 1"] = 10;
    data["Test 2"] = 30;
    data["Test 3"] = 15;

    for (int i = 0; i < 10000; i++) {
        isKeyExist = data.count("Test 2") > 0;
    }
}

int main()
{
    PerformanceBenchmark pb;

    pb.addCodeBlock("unordered_map (find)", codeBlock1);
    pb.addCodeBlock("unordered_map (count)", codeBlock2);
    pb.setIterationCount(50);

    cout << "Start\n\n";
    pb.runBenchmark();
    cout << pb.getResult() << "End\n";

    return 0;
}

실행 결과

위 예제는 std::unordered_map 키의 존재 여부를 find 메서드와 count 메서드 중 무엇이 더 빠른지 비교해 본 예제입니다. 각 10,000번 반복했을 때 걸린 시간 기준으로 측정했으며, 이를 다시 50번 반복해 평균값을 내어 비교해 보았습니다.

 

find 방법이 더 빠를 줄 알았는데 의외로 count 방법이 더 빨랐습니다. 아무래도 end 때문인 것 같은데 자세히는 뜯어봐야 알 것 같네요.


Source Code: https://github.com/nbsp1221/cpp-performance-benchmark

 

nbsp1221/cpp-performance-benchmark

C++ Performance Benchmark. Contribute to nbsp1221/cpp-performance-benchmark development by creating an account on GitHub.

github.com