Подтвердить что ты не робот

Как измерить время в C?

Я хочу узнать, как долго (приблизительно) выполняется какой-то блок кода. Что-то вроде этого:

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

Как?

4b9b3361

Ответ 1

Вы можете использовать метод clock в time.h

Пример:

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

Ответ 2

Вы можете использовать time.h, в частности time и difftime функции:

/* 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_t записывает секунды с эпоха UNIX (1 января 1970 г.)).

Ответ 3

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);
}

Ответ 4

Я бы использовал QueryPerformanceCounter и QueryPerformanceFrequency функции API Windows. Вызовите первое до и после блока и вычтите (current & minus; old), чтобы получить количество "тиков" между экземплярами. Разделите это на значение, полученное последней функцией, чтобы получить продолжительность в секундах.

Ответ 5

Если вам не требуется фантастическое разрешение, вы можете использовать GetTickCount(): http://msdn.microsoft.com/en-us/library/ms724408(VS.85).aspx (Если это для чего-то другого, кроме вашей собственной простой диагностики, то обратите внимание, что это число может обернуться, так что вам придется обрабатывать это с небольшой арифметикой).

QueryPerformanceCounter - еще один разумный вариант. (Он также описан в MSDN)

Ответ 6

Иногда требовалось измерить астрономическое время, а не процессорное время (особенно это применимо в 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;
}

Ответ 7

Вы можете использовать библиотеку blockprofile, просто заключив код, который вам нужен для профилирования, следующим образом

time_start("measurethis");
// your code here
time_end("measurethis");
time_summary();