Linux에서 C ++가 밀리 초 시간을 가져옴 — clock ()이 제대로 작동하지 않는 것 같습니다. 반올림하여 정밀도가 밀리 초

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
  • timertypedef가있는 클래스 템플릿 :
    • 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와 링크해야합니다.)