2012-10-14 3 views
2

가능한 중복을 : 난 시간이 일부 C++ 코드에서 문장의 특정 설정에 의해 지출 얻을 수있는 방법
How to Calculate Execution Time of a Code Snippet in C++문 실행 타이밍 - C++

?

리눅스에서는 time 유틸리티와 같지만 일부 특수한 경우에만 유용합니다.

+1

다음, 문 시작 실행 직전에 시간을 절약 할 그들이 실행하자, 다시 시간을 얻을 첫 번째를 빼지 다음 프로그램은 당신이 원하는 것을 그것으로부터의 시간. –

답변

2

당신은 GNU를 사용하는 경우의 gcc/g ++ :

이 --coverage으로 재 컴파일 시도 프로그램을 다시 실행하고 gprof은 유틸리티 결과 파일을 분석합니다. 함수의 실행 시간도 인쇄합니다.

편집 : --coverage가 아닌 -pg로 컴파일하고 링크하십시오. --coverage는 gcov (실제로 실행되는 행)입니다.

1

여기에 윈도우와 리눅스에서 잘 작동 코드의 매우 미세한 조각,이다 : "시작 시간"과 같은 https://stackoverflow.com/a/1861337/1483826
이 그것을 사용하여 실행하고 결과를 저장하려면 작업 후 - "종료 시간". 원하는 정확도로 빼십시오.

+1

다른 대답에 대한 단순한 링크 자체가 답이 아닙니다. "깃발"기능을 사용하여 중복 된 질문을 보내주십시오. – Mat

+0

@Mat : mrowa가 아직 깃발을 쌓을 수있을만큼 충분한 평판을 가지고 있는지 확실하지 않습니다. –

+0

@Mat : 나는 기원을 신용하려고합니다. 이것이 복사 및 붙여 넣기 대신 스 니펫에 연결하는 이유입니다. 가능한 복제본에 대해서는 꽤 옳다. (그리고 예, 15 기자부터 지금 기권하고 있습니다) –

2

간단한 타이밍 시스템을 작성해야합니다. C++에는 내장 된 방법이 없습니다.

#include <sys/time.h> 

class Timer 
{ 
private: 
    struct timeval start_t; 
public: 
    double start() { gettimeofday(&start_t, NULL); } 
    double get_ms() { 
     struct timeval now; 
     gettimeofday(&now, NULL); 
     return (now.tv_usec-start_t.tv_usec)/(double)1000.0 + 
       (now.tv_sec-start_t.tv_sec)*(double)1000.0; 
    } 
    double get_ms_reset() { 
     double res = get_ms(); 
     reset(); 
     return res; 
    } 
    Timer() { start(); } 
}; 

int main() 
{ 
    Timer t(); 
    double used_ms; 

    // run slow code.. 
    used_ms = t.get_ms_reset(); 

    // run slow code.. 
    used_ms += t.get_ms_reset(); 
    return 0; 
} 

측정 자체가 런타임에 상당한 영향을 줄 수 있습니다.

0

#inclide <ctime> 헤더를 사용할 수 있습니다. It's functions and their uses are here. 코드가 소비하는 시간을보고 싶다고합시다. 해당 부분이 시작되기 직전에 현재 시간을 가져야하고 해당 부분이 끝난 직후에 현재 시간을 가져야합니다. 그런 다음이 두 번 차이를 가져 오십시오. Readymade 함수는이 모든 작업을 수행하기 위해 ctime 내에 선언됩니다. 위의 링크를 체크 아웃하십시오.

2

std::chrono 또는 boost::chrono (컴파일러가 C++ 11을 지원하지 않는 경우)을이 용도로 사용할 수 있습니다.

std::chrono::high_resolution_clock::time_point start( 
    std::chrono::high_resolution_clock::now()); 
.... 
std::cout << (std::chrono::high_resolution_clock::now() - start); 
+1

'high_resolution_timer'가 아니라'high_resolution_clock'입니다 –

+0

@BenoitBlanchon 실수로 미안 해요. 내 대답을 편집했습니다. – BigBoss

1

스스로 시간을 측정해야합니다. 작은 스톱워치 클래스 I는 일반적으로 다음과 같습니다를 사용하고이 이름을 가진 함수가 이미 표준 라이브러리에 존재하기 때문에

#include <chrono> 
#include <iostream> 

template <typename Clock = std::chrono::steady_clock> 
class stopwatch 
{ 
    typename Clock::time_point last_; 

public: 
    stopwatch() 
     : last_(Clock::now()) 
    {} 

    void reset() 
    { 
     *this = stopwatch(); 
    } 

    typename Clock::duration elapsed() const 
    { 
     return Clock::now() - last_; 
    } 

    typename Clock::duration tick() 
    { 
     auto now = Clock::now(); 
     auto elapsed = now - last_; 
     last_ = now; 
     return elapsed; 
    } 
}; 

template <typename T, typename Rep, typename Period> 
T duration_cast(const std::chrono::duration<Rep, Period>& duration) 
{ 
    return duration.count() * static_cast<T>(Period::num)/static_cast<T>(Period::den); 
} 

int main() 
{ 
    stopwatch<> sw; 
    // ... 
    std::cout << "Elapsed: " << duration_cast<double>(sw.elapsed()) << '\n'; 
} 

duration_cast은 함수에 대한 최적의 이름이 될 수 없습니다. 자유롭게 더 나은 것을 생각해 내십시오. ;)

편집 : chrono는 C++ 11입니다.

6

당신은 표준 라이브러리에 <chrono> 헤더를 사용할 수 있습니다

#include <chrono> 
#include <iostream> 

unsigned long long fib(unsigned long long n) { 
    return (0==n || 1==n) ? 1 : fib(n-1) + fib(n-2); 
} 

int main() { 
    unsigned long long n = 0; 
    while (true) { 
     auto start = std::chrono::high_resolution_clock::now(); 
     fib(++n); 
     auto finish = std::chrono::high_resolution_clock::now(); 

     auto microseconds = std::chrono::duration_cast<std::chrono::microseconds>(finish-start); 
     std::cout << microseconds.count() << "µs\n"; 
     if (microseconds > std::chrono::seconds(1)) 
      break; 
    } 
} 
1

가능한 중복 : How to Calculate Execution Time of a Code Snippet in C++

당신은 (http://www.cplusplus.com/reference/clibrary/ctime/에서 자세히 설명)을 time.h의 C 표준 라이브러리를 사용할 수 있습니다.

#include <iostream> 
#include <time.h> 

using namespace std; 

int main() 
{ 
    clock_t t1,t2; 
    t1=clock(); 
    //code goes here 
    t2=clock(); 
    float diff = ((float)t2-(float)t1)/CLOCKS_PER_SEC; 
    cout << "Running time: " << diff << endl; 

    return 0; 
} 

당신은이 작업을 수행 할 수 있습니다 :

int start_s=clock(); 
// the code you wish to time goes here 
int stop_s=clock(); 
cout << "time: " << (stop_s-start_s)/double(CLOCKS_PER_SEC)*1000 << endl; 
+0

이것은 좋지 않습니다. 초당 시계 수를 계산하면 시계 속도가 변경 될 때 차이가 발생할 것입니다. 그 기술은 2005 년부터 존재했습니다. 위키피디아에 따르면 : https://en.wikipedia.org/wiki/SpeedStep 나는 이것을 downvote해야합니다. – Joeppie