programing

C로 시간을 측정하려면 어떻게 해야 하나요?

yoursource 2022. 7. 16. 00:33
반응형

C로 시간을 측정하려면 어떻게 해야 하나요?

어떤 코드 블록이 얼마나 (대략) 실행되는지 알고 싶습니다.다음과 같은 경우:

startStopwatch();
// do some calculations
stopStopwatch();
printf("%lf", timeMesuredInSeconds);

어떻게?

를 사용할 수 있습니다.clockmethod in time.h

예:

clock_t start = clock();
/*Do something*/
clock_t end = clock();
float seconds = (float)(end - start) / CLOCKS_PER_SEC;

time.h 라이브러리, 특히 시간과 시간 함수를 사용할 수 있습니다.

/* difftime example */
#include <stdio.h>
#include <time.h>

int main ()
{
  time_t start,end;
  double dif;

  time (&start);
  // Do some calculation.
  time (&end);
  dif = difftime (end,start);
  printf ("Your calculations took %.2lf seconds to run.\n", dif );

  return 0;
}

(위 링크된 difftime 웹 페이지에서 수정한 예)

이 방법에서는 몇 초간의 정확성밖에 얻을 수 없습니다.time_tUNIX 에폭(1970년 1월 1일) 이후의 초수를 기록합니다.

CPU 시간이 아닌 천문학적 시간을 측정해야 하는 경우가 있습니다(특히 Linux의 경우).

#include <time.h>

double what_time_is_it()
{
    struct timespec now;
    clock_gettime(CLOCK_REALTIME, &now);
    return now.tv_sec + now.tv_nsec*1e-9;
}

int main() {
    double time = what_time_is_it();
    printf("time taken %.6lf\n", what_time_is_it() - time);
    return 0;
}

GetTickCount().

#include <windows.h>
void MeasureIt()
{
    DWORD dwStartTime = GetTickCount();
    DWORD dwElapsed;

    DoSomethingThatYouWantToTime();

    dwElapsed = GetTickCount() - dwStartTime;

    printf("It took %d.%3d seconds to complete\n", dwElapsed/1000, dwElapsed - dwElapsed/1000);
}

Windows API의 Query Performance Counter 및 Query Performance Frequency 함수를 사용합니다.블록 전후에 전자를 호출하여 인스턴스 간의 "틱" 수를 구하려면 (현재 "틱" 수를 얻을 수 있습니다.이 값을 후자 함수로 얻은 값으로 나누면 시간(초)을 얻을 수 있습니다.

환상적인 해상도를 필요로 하지 않는 경우는, GetTickCount():http://msdn.microsoft.com/en-us/library/ms724408(VS.85).aspx 를 사용할 수 있습니다(자신의 간단한 진단 이외의 것을 위해서라면, 이 수치를 정리할 수 있기 때문에, 약간의 산술로 처리할 필요가 있습니다).

Query Performance Counter도 합리적인 옵션입니다.(MSDN에도 기재되어 있습니다)

표준 C 라이브러리는time이 기능은, 초수를 비교할 필요가 있는 경우에 편리합니다.단, 밀리초의 정밀도가 필요한 경우 가장 휴대성이 좋은 방법은timespec_get시스템이 지원하는 경우 최대 나노초의 정밀도를 알 수 있습니다.그러나, 그것을 부르는 것은 구조를 수반하기 때문에 조금 더 많은 노력이 필요하다.여기 구조를 단순한 64비트 정수로 변환하는 기능이 있습니다.

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

int64_t millis()
{
    struct timespec now;
    timespec_get(&now, TIME_UTC);
    return ((int64_t) now.tv_sec) * 1000 + ((int64_t) now.tv_nsec) / 1000000;
}

int main(void)
{
    printf("Unix timestamp with millisecond precision: %" PRId64 "\n", millis());
}

와는 달리clock이 함수는 Unix 타임스탬프를 반환하여 다음과 같은 블로킹 기능에 소요된 시간을 올바르게 계산합니다.sleep이 속성은 실행 시간을 고려한 지연 벤치마킹 및 구현에 도움이 됩니다.

언급URL : https://stackoverflow.com/questions/3557221/how-do-i-measure-time-in-c

반응형