ProgramingTip

타이밍 알고리즘 : C ++의 clock () 대 time ()

bestdevel 2020. 12. 8. 19:21
반응형

타이밍 알고리즘 : C ++의 clock () 대 time ()


알고리즘 타이밍 (대략 ms 단위)의 경우 다음 두 가지 방법 중 어느 것이 더 나은지 확인합니다.

clock_t start = clock();
algorithm();
clock_t end = clock();
double time = (double) (end-start) / CLOCKS_PER_SEC * 1000.0;

또는,

time_t start = time(0);
algorithm();
time_t end = time(0);
double time = difftime(end, start) * 1000.0;

또한 Freenode의 C ++ 채널에 대한 토론에서 해당의 해상도가 매우 나쁘다는 것을 알고 있습니다 (상대적으로) 빠른 알고리즘의 경우 타이밍이 0이 될 것입니다. 그러나 어느 것이 더 나은 해결 시간 () 또는 클록 ()을 가지고 있습니까? 아니면 동일인가?


원하는 항목에 따라 아래 time. 실시간을 clock측정하고 현재 프로세스에 소요되는 처리 시간 측정합니다. 프로세스가 상당한 시간 동안 휴면 상태이거나 시스템이 다른 프로세스로 바쁘다면 둘은 매우 많았습니다.

http://en.cppreference.com/w/cpp/chrono/c/clock


<chrono> C ++ 11을 사용하는 경우 더 나은 라이브러리가 될 것입니다.

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

void f()
{
    std::this_thread::sleep_for(std::chrono::seconds(1));
}

int main()
{
    auto t1 = std::chrono::high_resolution_clock::now();
    f();
    auto t2 = std::chrono::high_resolution_clock::now();
    std::cout << "f() took "
              << std::chrono::duration_cast<std::chrono::milliseconds>(t2-t1).count()
              << " milliseconds\n";
}

여기 에서 일련의 예 .


time_t 구조는 아마도 정수가 될 것입니다. 즉, 초의 해상도를 것입니다.

첫 번째 코드 : CPU가 어떤 작업을 수행 한 시간 만 계산 계산 sleep ()을 수행하면 아무 것도 계산하지. 수면 시간을 세는 우회 표류하기 시작할 것입니다.

두 번째 부분 : 초 단위의 분해능 만, 1 초 미만의 시간이 필요한 경우에는 그리 좋지 않습니다.

최상의 최상의 해상도로 시간을 측정 한 다음과 같이해야합니다.

double getUnixTime(void)
{
    struct timespec tv;

    if(clock_gettime(CLOCK_REALTIME, &tv) != 0) return 0;

    return (tv.tv_sec + (tv.tv_nsec / 1000000000.0));
}

double start_time = getUnixTime();
double stop_time, difference;

doYourStuff();

stop_time = getUnixTime();
difference = stop_time - start_time;

대부분의 시스템에서 해상도는 몇 마이크로 초까지 떨어지지 만 CPU에 따라 다를 수 있고 아마도 주요한 버전 일 수도 있습니다.


<chrono>최고입니다. Visual Studio 2013은이 기능을 제공합니다. 개인적으로 위에서 언급 한 모든 방법을 시도했습니다. <chrono>라이브러리 를 사용하는 것이 좋습니다 . 벽 시간을 추적 할 수 있으며 동시에 좋은 해상도 (1 초 미만)를 제공합니다.


gettimeofday는 어떻습니까? 호출되면 타이밍 정보와 함께 두 개의 구조체를 업데이트합니다. 일반적으로 왼손 구조체이면 충분하며 Epoch, 01-01-1970 00:00:00 (UTC) 이후 시간을 전달합니다. 다음과 같이 사용할 수 있습니다.

#include <time.h>

struct timeval start;
double mtime, seconds, useconds;
gettimeofday(&start, NULL); //left hand struct is usually enough
seconds  = start.tv_sec; //time in seconds
useconds = start.tv_usec; //time in microseconds

참고 URL : https://stackoverflow.com/questions/12231166/timing-algorithm-clock-vs-time-in-c

반응형