2013-04-01 2 views
3

프로그램을 작성하고 주어진 코드 블록이 실행될 때까지 걸리는 시간 (초)을 시도하고 있습니다. 그 후에 코드 블록을 몇 초 내에 실행하는 데 걸린 총 시간을 인쇄하고 싶습니다. 내가 쓴 것입니다 :인쇄 시간 (초 단위)

time_t start = time(0); 
// block of code 
double seconds_since_start = difftime(time(0), start); 
printf("seconds since start: %2.60f\n", seconds_since_start); 

나는이 printf() 인쇄 60 진수 정밀도와 시대의 모든 여전히 0.000000에 나올 ...

이 내 시간 함수의 오류? 나는 내가 시간을 부탁하고있는 일이 십진법의 정확도로 언제나 고려되지 않을 것이라고 믿기가 어렵다.

+0

시간()은 초를 반환합니다. 경과 시간이 1 초 미만이면 출력물에 항상 0이 인쇄됩니다. – craig65535

+0

항상 ''을 사용할 수 있습니다. – chris

+0

@ craig65535 : 항상 그런 것은 아닙니다! 두 번째 변경 직전에 타이밍을 시작하는 경우가 아닙니다. – TonyK

답변

6

당신은 C++ 11에서 사용할 수있는 날짜와 시간 유틸리티를 사용할 수 있습니다

#include <chrono> 
#include <iostream> 
#include <thread> 

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

    std::this_thread::sleep_for(std::chrono::seconds(5)); 

    auto end = std::chrono::high_resolution_clock::now(); 

    auto difference = std::chrono::duration_cast<std::chrono::seconds>(end - start).count(); 

    std::cout << "Seconds since start: " << difference; 
} 

Demo

+0

고해상도 타이머 대신에 단조로운 타이머가 필요할 수 있습니다. –

+0

@BenVoigt : 죄송합니다. 고해상도 타이머와 단조로운 타이머의 차이점은 무엇입니까? Castiblanco의 솔루션이 작동하지만, 나는 당신 자신의 함수를 작성하는 것에 의존한다는 사실을 싫어합니다.원하는 기능을 수행하는 데 필요한 기능을 포함하는 표준 패키지를 사용하는 것이 더 좋지 않습니까? – raphnguyen

+0

@ graphnguyen : 단조로운 타이머는 통과 시간을 측정합니다. 다른 시간은 시스템 달력을 기반으로합니다. 보통은 같지만 프로그램이 실행되는 동안 사용자 (또는 NTP 클라이언트 서비스)가 시스템 날짜 또는 시간을 업데이트하는 경우 ... –

5

time의 반환 값은 정수 (초)입니다. double으로 전송하면 분수 초를 잃지 않습니다.

gettimeofday (벽시계 시간이 필요한 경우) 또는 times (CPU 시간이 필요한 경우)과 같은 더 정밀한 시계 기능이 필요합니다.

Windows의 경우 timeGetTime, QueryPerformanceCounter (Castiblanco가 시연) 또는 GetSystemTimeAsFileTime이 있습니다.

C++는 마지막으로 C++ 11의 <chrono> 헤더를 사용하여 몇 가지 표준 고해상도 클록 함수를 얻었으며, 주석에 chris가 제안했습니다.

+0

Windows에서'gettimeofday'에 대한 인클루드 패키지가 있습니까? 아니면이 패키지가 UNIX 패키지입니까? – raphnguyen

+0

@ graphnguyen : Windows에서 사용할 수있는 몇 가지 옵션이 추가되었습니다. –

2

실제로 밀리 초 단위로 수행하는 것이 더 좋습니다. 단 몇 초 만에 0을 반환 할 수있는 함수가 많기 때문에 밀리 초를 사용하는 것이 좋습니다. 그런

#include <time.h> 

double performancecounter_diff(LARGE_INTEGER *a, LARGE_INTEGER *b){ 
    LARGE_INTEGER freq; 
    QueryPerformanceFrequency(&freq); 
    return (double)(a->QuadPart - b->QuadPart)/(double)freq.QuadPart; 
} 


int main() 
{ 

LARGE_INTEGER t_inicio, t_final; 
double sec; 

QueryPerformanceCounter(&t_inicio);  

// code here, the code that you need to knos the time. 

QueryPerformanceCounter(&t_final); 

sec = performancecounter_diff(&t_final, &t_inicio); 

printf("%.16g millisegudos\n", sec * 1000.0);*/ 

} 

return 0; 
} 
+1

좋은 접근법 (이것이 Windows 인 경우)이지만 'performancecounter_diff'를 호출하는 것을 잊었습니다. –

+0

나는 그것을 잊었다. 이제 실수를 바로 잡습니다. – Castiblanco

0

뭔가 작업을해야합니다 :

#include <stdio.h> 
#include <stdlib.h> 
#include <time.h> 

int main() 
{ 
    clock_t begin, end; 
    double time_spent; 

    begin = clock(); 

    //Do stuff 

    end = clock(); 
    time_spent = (double)(end - begin)/CLOCKS_PER_SEC; 
    printf("%Lf\n",time_spent); 
} 
1

사용할 수있는 boost::timer

template<typename T> 
double sortTime(std::vector<T>& v, typename sort_struct<T>::func_sort f){ 
    boost::timer t; // start timing 
    f(v); 
    return t.elapsed(); 
} 
관련 문제