Время выполнения алгоритма вычислений в C - PullRequest
3 голосов
/ 17 сентября 2011

Я использую библиотеку time.h в c, чтобы найти время, необходимое для запуска алгоритма.Структура кода выглядит следующим образом: -

#include <time.h>

int main()
{
  time_t start,end,diff;

  start = clock();
    //ALGORITHM COMPUTATIONS
  end = clock();
  diff = end - start;
  printf("%d",diff);
  return 0;
}

Значения для начала и конца всегда равны нулю.Это то, что функция clock () не работает?Пожалуйста помоги.Заранее спасибо.

Ответы [ 4 ]

2 голосов
/ 17 сентября 2011

Не то чтобы это не сработало.На самом деле это так.Но это неправильный способ измерения времени, поскольку функция clock () возвращает приблизительное значение процессорного времени, используемого программой.Я не уверен насчет других платформ, но в Linux вы должны использовать clock_gettime () с флагом CLOCK_MONOTONIC - это даст вам реальное истекшее время.Кроме того, вы можете прочитать TSC , но имейте в виду, что он не будет работать, если у вас многопроцессорная система и ваш процесс не привязан к конкретному ядру.Если вы хотите проанализировать и оптимизировать свой алгоритм, я бы порекомендовал вам использовать некоторые инструменты измерения производительности.Я давно пользуюсь Intel vTune и очень доволен.Он покажет вам не только то, какая часть использует больше всего циклов, но выделит проблемы с памятью, возможные проблемы параллелизма и т. Д. Вы можете быть очень удивлены результатами.Например, большинство циклов ЦП может быть потрачено на ожидание шины памяти.Надеюсь, это поможет!

ОБНОВЛЕНИЕ: На самом деле, если вы работаете в более поздних версиях Linux, он может предоставить CLOCK_MONOTONIC_RAW, который представляет собой аппаратные часы, которые не подлежат настройкам NTP.Вот небольшой фрагмент кода, который вы можете использовать:

0 голосов
/ 17 сентября 2011

Обратите внимание, что clock() возвращает время выполнения в тактах, а не время настенных часов.Разделите разницу двух clock_t значений на CLOCKS_PER_SEC, чтобы преобразовать разницу в секунды.Фактическое значение CLOCKS_PER_SEC является вопросом качества реализации.Если он низкий (скажем, 50), ваш процесс должен будет работать в течение 20 мс, чтобы вызвать ненулевое возвращаемое значение из clock().Убедитесь, что ваш код работает достаточно долго, чтобы увидеть clock() увеличение.

0 голосов
/ 17 сентября 2011

Рассмотрим код ниже:

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

int main()
{
    clock_t t1, t2;
    t1 = t2 = clock();

    // loop until t2 gets a different value
    while(t1 == t2)
        t2 = clock();

    // print resolution of clock()
    printf("%f ms\n", (double)(t2 - t1) / CLOCKS_PER_SEC * 1000);

    return 0;
}

Выход:

$ ./a.out 
10.000000 ms

Возможно, ваш алгоритм работает меньше времени. Используйте gettimeofday для таймера с более высоким разрешением.

0 голосов
/ 17 сентября 2011

Обычно я делаю это так:

clock_t start = clock();
clock_t end;

//algo

end = clock();
printf("%f", (double)(end - start));
...