C++ 시간함수 성능비교 #1

#include <iostream>
#include <thread>
#include <chrono>
#include <mutex>
#include <atomic>
#include <windows.h>

auto main() -> int
{
    std::cout << "start" << std::endl;
    constexpr int COUNT = 10000000;
    
    {
        auto startTime = std::chrono::steady_clock::now();
        long long accCount = 0;

        for (int i = 0; i < COUNT; i++)
        {
            volatile auto now = std::chrono::steady_clock::now();
        }
        auto endTime = std::chrono::steady_clock::now();

        std::cout << "std std::chrono steady clock : "
            << std::chrono::duration_cast<std::chrono::milliseconds>(endTime - startTime).count()
            << "ms" 
            << ", accCount : " << accCount << std::endl;
    }

    {
        auto startTime = std::chrono::steady_clock::now();
        auto initTime = std::chrono::system_clock::now();
        long long accCount = 0;

        for (int i = 0; i < COUNT; i++)
        {
            volatile auto now = std::chrono::system_clock::now();
        }

        auto endTime = std::chrono::steady_clock::now();
        std::cout << "std std::chrono system clock : "
            << std::chrono::duration_cast<std::chrono::milliseconds>(endTime - startTime).count()
            << "ms" << std::endl;
    }

    {
        auto startTime = std::chrono::steady_clock::now();
        
        SYSTEMTIME stInit;
        GetSystemTime(&stInit);
        long long accCount = 0;

        for (int i = 0; i < COUNT; i++)
        {
            SYSTEMTIME stNow;
            GetSystemTime(&stNow);
            volatile WORD sec = stNow.wSecond;
        }

        auto endTime = std::chrono::steady_clock::now();
        std::cout << "windows  : "
            << std::chrono::duration_cast<std::chrono::milliseconds>(endTime - startTime).count()
            << "ms" 
            << ", accCount : " << accCount << std::endl;
    }

    {
        auto startTime = std::chrono::steady_clock::now();

        bool isShutdown = false;
        std::atomic<SYSTEMTIME> stNow;
        auto timer = std::thread([&isShutdown, &stNow]() {
            while (isShutdown == false)
            {
                {
                    SYSTEMTIME now;
                    GetSystemTime(&now);
                    stNow = now;
                }
                ::Sleep(0);
            }
            });

        for (int i = 0; i < COUNT/10; i++)
        {
            SYSTEMTIME now = stNow;
            for (int i = 0; i < 10; i++)
            {
                volatile WORD sec = now.wSecond;
            }
        }

        auto endTime = std::chrono::steady_clock::now();
        std::cout << "Threading windows  : "
            << std::chrono::duration_cast<std::chrono::milliseconds>(endTime - startTime).count()
            << "ms" << std::endl;

        isShutdown = true;
        timer.join();
    }
}
Visualstudio 2019 16.9.2 Release x64

음… 루프 숫자를 올렸을때 시간이 선형적으로 증가하는걸로 봐서.. 대충 최적화 되서 함수콜이 날아가 버리지 않고 정직하게 호출됬다고 생각됨.

Threading windows는 시간 관련 함수의 성능 때문에 스레드로 빼서 시간을 업데이트하는 스레드가 별도로 있고 다른 스레드는 그 값을 가져와서 쓰는 부분을 모사한것. (일반 콜에 비해서 시간 업데이트는 가끔. 여러 스레드가 업데이트된 값을 가져다가 쓰는 형태)

chrono의 성능은 나쁘지 않음.
시간이 살짝 부정확 하더라도 함수 콜 숫자를 줄이고 싶다면 스레딩

댓글 남기기

이메일은 공개되지 않습니다. 필수 입력창은 * 로 표시되어 있습니다