2010-01-20 5 views
2

성능 비교 테스트를하고 있습니다. 내 C + + 테스트 응용 프로그램에 대한 런타임을 기록하고 다른 상황에서 비교하고 싶습니다. 비교할 두 가지 경우는 1) 파일 시스템 드라이버가 설치되어 활성화되어 있고 2) 동일한 파일 시스템 드라이버가 설치되어 활성화되어 있지 않은 경우에도 해당됩니다.Windows : c/C++ 응용 프로그램을 실행하는 데 걸리는 시간은 어떻게 계산합니까?

일련의 테스트가 여러 운영 체제에서 수행되며 위에 설명 된 두 가지 실행은 각 운영 체제 및 설치에 대해 수행됩니다. 결과는 주어진 운영 체제 및 설정에 대한 두 가지 경우에만 비교됩니다.

실시간 시스템이 아닌 운영 체제에서 c/C++ 응용 프로그램을 실행할 때 응용 프로그램 실행에 소요되는 시간을 확보 할 방법이 없다는 것을 알고 있습니다. 테스트 응용 프로그램이 꽤 오랜 기간 동안 실행되는 한 이것이 큰 문제는 아니라고 생각합니다. 따라서 CPU의 일정, 우선 순위, 전환 등을 무시할 수 있습니다.

편집 : Windows 플랫폼 전용 테스트 응용 프로그램 내에서 정확한 응용 프로그램 런타임 결과를 어떻게 만들 수 있습니까?

+0

운영체제? –

+2

"응용 프로그램을 실행하는 데 걸리는 실시간을 얻을 방법이 없습니다."이게 무슨 뜻입니까? 당신이 얻을 수없는이 '진짜'시간은 무엇입니까? 경과 시간은 나에게 진짜처럼 보인다. –

+0

실시간은 프로그램에서 코드를 처리하는 데 걸리는 실제 시간입니다. 실시간이 아닌 OS는 프로세스를 관리하고 우선 순위 등에 따라 어떤 프로세스가 실행될 것인지를 전환합니다. 응용 프로그램이 실행되는 데 걸리는 전체 시간은 일반적으로 응용 프로그램이 실제로 처리하는 시간보다 큽니다. 프로세스와 응용 프로그램 사이에서 OS를 전환 할 때 약간의 대기 상태가 있기 때문입니다. –

답변

1

당신이

#if _DEBUG 
time end = time(NULL); 
#endif 

에서와이

#if _DEBUG 
time_t start = time(NULL); 
#endif 

를 넣고 완료 ​​할 수 있습니다 당신의 프로그램이 변경되지 귀하의 int main() 방법. 당연히 당신은 로그 또는 cout 그것으로 차이를 반환해야합니다.

+0

다른 솔루션 중 일부는 강력한 기능을 갖추고 있었지만 가장 간단한 솔루션이었습니다. 사용을 끝내고 내가 말할 수있는 한 제대로 작동하는 것 같습니다. –

+0

@wheaties : 위에 사용 된 시간 단위는 무엇입니까? – Lazer

+0

@ 초 단위로 표시됩니다. 내가 두려워하는 것보다 더 정확하게 시간을 정할 수는 없다. 그러나 대부분의 응용 프로그램에서는 작업이 완료됩니다. – wheaties

5

POSIX 시스템을 사용하는 경우 time 명령을 사용하면 총 "벽시계"시간과 실제 CPU 시간 (사용자 및 시스템)을 얻을 수 있습니다.

편집 : 분명히 Windows Server 2003 Resource Kit에있는 Windows 시스템에 해당하는 항목이 있습니다 (확인되지 ​​않음) timeit.exe입니다.

+1

예, cygwin에서 유닉스 '시간'명령을 제공하지만 timeit.exe가 Windows 시스템에서이 작업을 수행하는 가장 좋은 방법입니다. –

+0

timeit.exe가 Windows Vista 및 Win7에서 작동하는지 알고 있습니까? –

+0

Google에서 두 인스턴스를 모두 볼 수 있지만 확인 방법이 없습니다. – ezod

1

그냥 ezod의 답변을 확장하십시오.
당신은 총 시간을 얻을 수있는 시간 명령으로 프로그램을 실행 -

1

Windows 시스템에 있다면 당신은 QueryPerformanceCounter()를 호출하여 높은 성능 카운터를 사용할 수 있습니다

#include <windows.h> 
#include <string> 
#include <iostream> 

int main() 
{ 
    LARGE_INTEGER li = {0}, li2 = {0}; 
    QueryPerformanceFrequency(&li); 
    __int64 freq = li.QuadPart; 

    QueryPerformanceCounter(&li); 
     // run your app here... 
    QueryPerformanceCounter(&li2); 

    __int64 ticks = li2.QuadPart-li.QuadPart; 
    cout << "Reference Implementation Ran In " << ticks << " ticks" << " (" << format_elapsed((double)ticks/(double)freq) << ")" << endl; 
    return 0; 
} 

은 ... 그냥 보너스로, 여기에 (경과 시간을 변환하는 기능입니다 설명 문자열 초, 부동 소수점) :

std::string format_elapsed(double d) 
{ 
    char buf[256] = {0}; 

    if(d < 0.00000001) 
    { 
     // show in ps with 4 digits 
     sprintf(buf, "%0.4f ps", d * 1000000000000.0); 
    } 
    else if(d < 0.00001) 
    { 
     // show in ns 
     sprintf(buf, "%0.0f ns", d * 1000000000.0); 
    } 
    else if(d < 0.001) 
    { 
     // show in us 
     sprintf(buf, "%0.0f us", d * 1000000.0); 
    } 
    else if(d < 0.1) 
    { 
     // show in ms 
     sprintf(buf, "%0.0f ms", d * 1000.0); 
    } 
    else if(d <= 60.0) 
    { 
     // show in seconds 
     sprintf(buf, "%0.2f s", d); 
    } 
    else if(d < 3600.0) 
    { 
     // show in min:sec 
     sprintf(buf, "%01.0f:%02.2f", floor(d/60.0), fmod(d,60.0)); 
    } 
    // show in h:min:sec 
    else 
     sprintf(buf, "%01.0f:%02.0f:%02.2f", floor(d/3600.0), floor(fmod(d,3600.0)/60.0), fmod(d,60.0)); 

    return buf; 
} 
+0

저는 고정밀도가 필요하지 않으며 다양한 시스템에 다양한 출력 유형이있는 것으로 보입니다. 이것은 좋은 제안이지만, 나는 그것이 내가하고있는 일을 위해 약간은 있다고 생각한다. –

+0

@Brian : 아마도, GetTickCount()의 세분성이 보이는 것처럼 보이지 않을 수도 있습니다. 문서에서는 밀리 초 단위로 값을 반환한다고하지만, 그 값의 세밀도는 아마도 수백 밀리 초라고 말하지 않습니다. 장기 실행 프로그램의 경우 (1 초 초과), 이것은 문제가되지 않지만 타이밍 코드 블록 GetTickCount()는 쓸모가 없습니다. –

+0

맞습니다. 지정된 디렉토리 경로 내의 모든 파일에서 문자 x 개를 찾고 열거 나 읽는 작업을 타이밍을 올릴 것입니다. 실행 시간은 초이며 아마도 몇 분이 걸릴 것입니다. –

2

나는 당신이 요구하는 것은 내가 기타로,에 관계없이 '외부'요인, 프로세스가 실행하는 데 걸리는 시간을 측정하려면 어떻게 "생각 프로그램이 시스템에서 실행 중입니까? " 이 경우 가장 쉬운 방법은 프로그램을 여러 번 실행하고 평균 시간을 얻는 것입니다. 이 방법을 사용하면 OS가 CPU 시간을 소비하는 다양한 무작위적인 것들이 평균화 될 것으로 기대하면서보다 의미있는 비교를 할 수 있습니다. 실제적인 생각을하고 싶다면 두 샘플 t- 테스트와 같은 통계 테스트를 사용하여 평균 타이밍의 차이가 실제로 중요한지 확인할 수 있습니다.

+1

니스 대답, 나는 통계를 가지고 좋은 생각이지만 과잉이라고 생각합니다. –

0

Cygwin을 다운로드하고 시간 명령에 인수로 전달하여 프로그램을 실행하십시오. 작업이 끝나면 Cygwin과 함께 제공되는 나머지 유닉스 도구에 대해 배우십시오.이것은 당신이 만드는 당신의 경력을위한 최고의 투자 중 하나가 될 것입니다; Unix toolchest는 영원한 고전입니다.

+1

그게 좋은 생각이지만 설치 한 각 테스트 시스템에 Cygwin을 설치해야합니까? 나는 테스트 머신에 아무 것도 설치하지 않아도된다. –

+0

USB 스틱에 cygwin의 최소 설치를 복사 할 수 있습니다. –

+0

설치하는 데 시간이 얼마나 걸립니까? 고스트 이미지에서 다시 고스트가 될 시스템에서이 테스트를 반복하여 반복 해 나갈 것입니다. 나는 다양한 Windows OS에서 테스트를 실행하고 시간과 시간을 다시 설치하는 데 시간을 낭비하고 싶지 않습니다. –

0

QueryPerformanceCounter에 멀티 코어 시스템에 문제가있을 수 있습니다, 그래서 당신은 전과 '(1) timeBeginPeriod'을 필요로 밀리 초

에 결과를 제공 timeGetTime()를 사용하는 것을 선호 'timeEndPeriod (1)'이후 줄이기 위해 당신이 할 수있는 한 세분성은 있지만 (게임에서 타임 스텝을 규제하는) 내 목적을 위해 훌륭하게 작동한다는 것을 알았으므로 벤치마킹은 괜찮습니다.

관련 문제