2014-05-12 4 views
2

Windows C++에서 실행 시간을 밀리 초 또는 마이크로 초 단위로 측정하는 방법은 무엇입니까?Windows C++의 시간, 밀리 초 또는 마이크로 초 측정

많은 메서드 호출 시간 (NULL)이 있지만 초 단위로 시간을 측정하고 clock() (clock_t)은 실제 시간이 아닌 CPU 시간을 측정합니다.

나는이 문서에 언급 된 (일정 시간) 기능은 gettimeofday를 발견

이 기능은 리눅스 (계산 밀리 시간 및 마이크로 초)입니다 dropbox.com/s/k0zv8pck7ydbakz/1_7-PDF_thesis_2.pdf 및 Windows가 아닙니다.

나는 Windows 용 그것에 대한 대안을 발견 는

을 dropbox.com/s/ofo99b166l7e2gf/gettimeofday.txt 그리고이 관련이있을 수 : stackoverflow.com/questions/1861294/how-to-calculate-execution를 -time-of-a-code-snippet-in-c

+0

당신은 CLR의 지원으로 C++를 사용하고 있습니까? 또는 Win32? 이 질문은 질문에 대한 일반적인 이해가 부족합니다. –

+0

win32와 함께 C++ 사용 – user3617694

+0

이 질문은 잘 부탁되지 않지만 복구 할 수 있다고 생각합니다. +1 공정성에 대한 관심, 그리고 누군가가 이것을 편집하는 데 도움이 될 수 있습니까? –

답변

15

당신은 표준 C++ <chrono> library를 사용할 수 있습니다 염두에 두어야

#include <iostream> 
#include <chrono> 

// long operation to time 
int fib(int n) { 
    if (n < 2) { 
    return n; 
    } else { 
    return fib(n-1) + fib(n-2) 
    } 
} 

int main() { 
    auto start_time = std::chrono::high_resolution_clock::now(); 

    fib(12); 

    auto end_time = std::chrono::high_resolution_clock::now(); 
    auto time = end_time - start_time; 

    std::cout << "fib(100) took " << 
    std::chrono::duration_cast<std::chrono::microseconds>(time).count() << " to run.\n"; 
} 

한 가지 <chrono>를 사용하여 당신이 다르게 그것을 조금 사용이 그 혜택을받을 수 밖에 타입 안전, 일반적인 타이밍 코드를 수 있다는 것입니다 int과 같은 유형에 지속 시간 및 시간 지점을 저장하는 바보 타입의 안전하지 않은 타이밍 라이브러리를 사용합니다. https://stackoverflow.com/a/15839862/365496


high_resolution_clock의 낮은 해상도가 고정 된 것을 비주얼 스튜디오의 표준 라이브러리 구현 has indicated의 메인테이너 : 여기에 몇 가지 특정 사용 시나리오와 크로노를 사용하는 유형이 지정되지 않은 라이브러리와 모범 사례를 사용 사이의 차이점을 설명 답변입니다 VS2015를 사용하여 QueryPerformanceCounter().

+0

**주의 ** Visual Studio와 함께 제공되는 일부 버전의 'chrono' 헤더에는 버그가 있습니다. [여기] (http://stackoverflow.com/questions/16299029/resolution-of-stdchronohighresolution-clock-doesnt-correspond-to-measureme)를 참조하십시오. QueryPerformanceCounter는 Win32에서 고해상도 타이밍을 얻는 방법입니다. – Rook

+0

VS 2015가 'high_resolution_clock'에 대해 'QueryPerformanceCounter'를 사용하고 있음을 확인할 수 있습니다. (이전 버전의 VS 버전은 모든 클럭에'GetSystemTime'을 사용했습니다.) –

2

QPC/QPF API를 사용하여 실행 시간을 계산해야합니다. QueryPerformanceCounter을 호출하는 코드를 호출 한 다음 QueryPerformanceFrequency을 사용하여 코드를 사이클에서 마이크로 초로 변환합니다.

LARGE_INTEGER nStartTime; 
LARGE_INTEGER nStopTime; 
LARGE_INTEGER nElapsed; 
LARGE_INTEGER nFrequency; 

::QueryPerformanceFrequency(&nFrequency); 
::QueryPerformanceCounter(&nStartTime); 

    SomethingToBeTimed(); 

::QueryPerformanceCounter(&nStopTime); 
nElapsed.QuadPart = (nStopTime.QuadPart - nStartTime.QuadPart) * 1000000; 
nElapsed.QuadPart /= nFrequency.QuadPart; 

참고 : http://msdn.microsoft.com/en-us/library/windows/desktop/dn553408(v=vs.85).aspx