Windows에서는 clock()
시간을 밀리 초 단위로 반환하지만 제가 작업중인이 Linux 상자에서는 가장 가까운 1000으로 반올림하여 정밀도가 밀리 초 수준이 아닌 “초”수준으로 만 표시됩니다.
QTime
클래스를 사용하여 Qt로 솔루션을 찾고 객체를 인스턴스화하고 호출 start()
한 다음 elapsed()
밀리 초 경과 시간을 가져 오기 위해 호출 했습니다.
처음에는 Qt로 작업하고 있기 때문에 운이 좋았지 만 타사 라이브러리에 의존하지 않는 솔루션을 원합니다.
이를 수행하는 표준 방법이 없습니까?
최신 정보
Boost .. 추천하지 마세요.
Boost와 Qt가 그것을 할 수 있다면 확실히 마술이 아닙니다. 그들이 사용하는 표준이 있어야합니다!
답변
메서드의 시작과 끝에서 gettimeofday를 사용한 다음 두 반환 구조체를 구분할 수 있습니다. 다음과 같은 구조를 얻게됩니다.
struct timeval {
time_t tv_sec;
suseconds_t tv_usec;
}
편집 : 아래의 두 의견에서 알 수 있듯이 clock_gettime (CLOCK_MONOTONIC)은 사용 가능한 경우 훨씬 더 나은 선택이며 요즘 거의 모든 곳에 있어야합니다.
편집 : 다른 사람은 std :: chrono :: high_resolution_clock과 함께 최신 C ++를 사용할 수도 있다고 언급했지만 단조롭다는 보장은 없습니다. 대신 steady_clock을 사용하십시오.
답변
#include <sys/time.h>
#include <stdio.h>
#include <unistd.h>
int main()
{
struct timeval start, end;
long mtime, seconds, useconds;
gettimeofday(&start, NULL);
usleep(2000);
gettimeofday(&end, NULL);
seconds = end.tv_sec - start.tv_sec;
useconds = end.tv_usec - start.tv_usec;
mtime = ((seconds) * 1000 + useconds/1000.0) + 0.5;
printf("Elapsed time: %ld milliseconds\n", mtime);
return 0;
}
답변
벽시계 시간 clock
은 측정 하지 않으므로 양해 바랍니다 . 즉, 프로그램에 5 초가 걸리면 clock
반드시 5 초를 측정하지는 않지만 더 많을 수 있습니다 (프로그램이 여러 스레드를 실행할 수 있으므로 실시간보다 더 많은 CPU를 소비 할 수 있음). 사용 된 CPU 시간 의 근사치를 측정합니다 . 차이점을 확인하려면이 코드를 고려하십시오.
#include <iostream>
#include <ctime>
#include <unistd.h>
int main() {
std::clock_t a = std::clock();
sleep(5); // sleep 5s
std::clock_t b = std::clock();
std::cout << "difference: " << (b - a) << std::endl;
return 0;
}
내 시스템에 출력
$ difference: 0
왜냐하면 우리가 한 것은 CPU 시간을 사용하지 않고 잠자기 때문입니다! 그러나 gettimeofday
우리는 우리가 원하는 것을 얻습니다 (?)
#include <iostream>
#include <ctime>
#include <unistd.h>
#include <sys/time.h>
int main() {
timeval a;
timeval b;
gettimeofday(&a, 0);
sleep(5); // sleep 5s
gettimeofday(&b, 0);
std::cout << "difference: " << (b.tv_sec - a.tv_sec) << std::endl;
return 0;
}
내 시스템의 출력
$ difference: 5
더 많은 정밀도가 필요하지만 CPU 시간 을 얻으려면 getrusage
함수 사용을 고려할 수 있습니다 .
답변
Boost에서 제공하는 도구도 추천합니다. 언급 된 Boost Timer 또는 Boost.DateTime에서 무언가를 해킹하거나 샌드 박스에 새로 제안 된 라이브러리 가 있습니다 -Boost.Chrono :이 마지막 것은 Timer를 대체하며 다음과 같은 기능을 제공합니다.
- 다음을 포함한 C ++ 0x 표준 라이브러리의 시간 유틸리티 :
- 클래스 템플릿
duration
- 클래스 템플릿
time_point
- 시계 :
system_clock
monotonic_clock
high_resolution_clock
- 클래스 템플릿
timer
typedef가있는 클래스 템플릿 :system_timer
monotonic_timer
high_resolution_timer
- 프로세스 클록 및 타이머 :
process_clock
, 실제, 사용자 CPU 및 시스템 CPU 시간을 캡처합니다.process_timer
, 경과 된 실제, 사용자 CPU 및 시스템 CPU 시간을 캡처합니다.run_timer
, | process_timer |의 편리한보고 결과.
- C ++ 0x 표준 라이브러리의 컴파일 시간 합리적 산술.
답변
CTT의 답변을Timer
기반으로 수업을 작성했습니다 . 다음과 같은 방법으로 사용할 수 있습니다.
Timer timer = Timer();
timer.start();
/* perform task */
double duration = timer.stop();
timer.printTime(duration);
구현은 다음과 같습니다.
#include <stdio.h>
#include <stdlib.h>
#include <sys/time.h>
using namespace std;
class Timer {
private:
timeval startTime;
public:
void start(){
gettimeofday(&startTime, NULL);
}
double stop(){
timeval endTime;
long seconds, useconds;
double duration;
gettimeofday(&endTime, NULL);
seconds = endTime.tv_sec - startTime.tv_sec;
useconds = endTime.tv_usec - startTime.tv_usec;
duration = seconds + useconds/1000000.0;
return duration;
}
static void printTime(double duration){
printf("%5.6f seconds\n", duration);
}
};
답변
코드를 이전 유니스로 이식 할 필요가없는 경우 clock_gettime ()을 사용하여 나노초 단위로 시간을 제공 할 수 있습니다 (프로세서가 해당 해상도를 지원하는 경우). POSIX이지만 2001 년부터.
답변
clock ()은 종종 꽤 형편없는 해상도를 가지고 있습니다. 밀리 초 수준에서 시간을 측정하려면 이 질문에 설명 된 대로 clock_gettime ()을 사용하는 방법이 있습니다 .
(Linux에서는 -lrt와 링크해야합니다.)