2012-06-25 2 views
-4

C++에서 코드의 일부 실행 시간 (MS)은 어떻게 계산합니까?C++ 코드의 일부 실행 시간

+0

하나는 프로파일 러를 사용하거나 관심있는 코드 섹션 후/전에 타이머 기능에 호출을 삽입합니다. 연구 노력을 보이지 않기 위해 –

+6

-1. –

+0

''은 C++ 11을 사용하면 잘 작동합니다. 한번 사용해 본 적이 없다면 이해하기가 약간 어려울 수도 있지만 일단 나 가면 나쁘지 않습니다. – chris

답변

2

휴대용 코드로 수행 할 수있는 최선의 작업은 clock()으로 시간을 맞추는 것입니다.

clock_t start = clock(); 
// code to time goes here 
clock_t stop = clock(); 

double seconds = double(stop-start)/CLOCKS_PER_SEC; 

C++ 11은 작업이 간단하고 청소 할 수 time_pointduration하기위한 클래스와 <chrono>라는 이름의 새로운 헤더를 추가합니다. 그러나 이들 중 어느 것도 밀리 초 레벨 정확도 (또는 정밀도)를 보장하지 않습니다. 새로운 클래스에는 나노초 범위의 지속 시간 동안 typedef가 있지만 실제 결과가 정확할지 여부는 보장되지 않습니다 (그러나 가장 일반적인 OSes로는 대답이 보통 "not"입니다).

+0

나는 "최고"라고 앉지 않았다. 'clock()'이 다소 낮은 해상도를 가질 수 있기 때문에 OS의 특정 기능을 # ifdef하는 것이 더 좋을 것입니다. –

+0

OS 정의 함수가'#ifdef '하는 것은 이식성이없는 코드입니다. 'clock '의 해상도는 다양하지만 확실히 낮을 수 있습니다. 이식성있는 코드의 경우 여전히 최선의 방법을 사용할 수 있습니다. 그것들은이 목적을 위해 의도 된 것은 아니지만 어쨌든이 용도로 사용할 수 있습니다. –

+0

그래도 실제로는 잘 작동하고 작은 시간 범위를 측정 할 수있는 더 나은 기능을 제공하는 코드가 생성됩니다. 하지만 그렇습니다. 비표준이므로 기술적으로 이식 가능하지 않습니다. –

0

여기에 C++ (11 아님)을 사용하지만 많은 라이브러리가 더 정교한 솔루션을 가지고있을 수 있습니다. 코드에는 Qt가 필요하지만 쉽게 수행 할 수 있습니다. 운영 체제에 따라 CLOCK_MONOTONIC을 교체해야 할 수도 있습니다.

#ifndef PROFILER_H 
#define PROFILER_H 

#include <sys/time.h> 
#include <QString> 

class Profiler 
{ 
    public: 
    Profiler(QString const& name); 
    long measure() const; 

    long measureNs() const; 
    double measureMs() const; 
    double measureS() const; 
    void printNs() const; 
    void printMs() const; 
    void printS() const; 
    private: 
    QString mName; 
    timespec mTime; 
}; 

#endif // PROFILER_H 

#include "profiler.h" 
#include <QDebug> 
#include <assert.h> 
#include <iostream> 

Profiler::Profiler(QString const& name):mName(name){ 
    clock_gettime(CLOCK_MONOTONIC, &mTime); // Works on Linux 
} 


long int Profiler::measureNs() const{ 
    timespec end; 
    clock_gettime(CLOCK_MONOTONIC, &end); // Works on Linux 
    long int diff = (end.tv_sec-mTime.tv_sec) * 1000000000 + (end.tv_nsec - mTime.tv_nsec); 
    assert(diff>0); 
    return diff; 
} 

double Profiler::measureMs() const{ 
    return measureNs()/1000000.0; 
} 

double Profiler::measureS() const{ 
    return measureMs()/1000.0; 
} 

void Profiler::printNs() const{ 
    qDebug() << mName << "Time elapsed:" << measureNs() << "ns"; 
} 

void Profiler::printMs() const{ 
    qDebug() << mName << "Time elapsed:" << measureMs() << "ms"; 
} 

void Profiler::printS() const{ 
    qDebug() << mName << "Time elapsed:" << measureS() << "S"; 
} 

사용법 :

Profiler pro("Tag you want"); 
function(); 
pro.printMs(); 
관련 문제