Расчет времени выполнения с помощью функции time () - PullRequest
0 голосов
/ 07 августа 2011

Мне дали следующее задание HomeWork,

Напишите программу для проверки на вашем компьютере, сколько времени потребуется для выполнения nlogn, n2, n5, 2n и n!дополнения для n = 5, 10, 15, 20.

Я написал кусок кода, но все время получаю время выполнения 0. Может кто-нибудь помочь мне с этим?Спасибо

#include <iostream>
#include <cmath>
#include <ctime>
using namespace std;
int main()
{
 float n=20;
 time_t start, end, diff;
  start = time (NULL);
  cout<<(n*log(n))*(n*n)*(pow(n,5))*(pow(2,n))<<endl;
  end= time(NULL);
 diff = difftime (end,start);
 cout <<diff<<endl;
 return 0;
}

Ответы [ 5 ]

5 голосов
/ 07 августа 2011

лучше, чем time () с точностью до секунды, использовать точность в миллисекундах. например,

int main(){
clock_t start, end;
double msecs;

start = clock();
/* any stuff here ... */
end = clock();
msecs = ((double) (end - start)) * 1000 / CLOCKS_PER_SEC;
return 0;
}
3 голосов
/ 07 августа 2011

Выполните каждое вычисление тысячи раз в цикле, чтобы вы могли преодолеть низкое разрешение time и получить значимые результаты. Не забудьте поделить на количество итераций при сообщении результатов.

Это не очень точно, но, вероятно, это не имеет значения для этого задания.

2 голосов
/ 08 августа 2011

По крайней мере, в Unix-подобных системах time() дает вам только 1-секундную детализацию, поэтому он бесполезен для хронирования вещей, которые занимают очень короткое время (если вы не выполняете их много раз в цикле).Взгляните на функцию gettimeofday(), которая показывает текущее время с микросекундным разрешением.Или рассмотрите возможность использования clock(), который измеряет время процессора, а не время настенных часов.

1 голос
/ 07 августа 2011

Возможно, вам придется найти более точный таймер для конкретной платформы, например, высокопроизводительный таймер Windows.Вы также можете (очень вероятно) обнаружить, что ваш компилятор оптимизирует или удаляет почти весь ваш код.

1 голос
/ 07 августа 2011

Ваш код выполняется слишком быстро, чтобы быть обнаруженным функцией time , возвращающей количество секунд, прошедших с 00:00 часов, 1 января 1970 UTC.

Попробуйте использовать этот кусок кода:

inline long getCurrentTime() {
    timeb timebstr;
    ftime( &timebstr );
    return (long)(timebstr.time)*1000 + timebstr.millitm;
}

Чтобы использовать его, вы должны включить sys / timeb.h.

На самом деле, лучше повторить вычисления в цикле, чтобы получить более точные результаты.

...