2011-08-07 2 views
0

мне дали следующее домашнее задание,Расчет времени исполнения с функцией времени()

Написать программу для проверки на вашем компьютере, сколько времени требуется, чтобы сделать NlogN, n2, n5, 2п, и п! дополнения для 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; 
} 
+0

Кажется, вам нужно выполнить операцию добавления, которая много раз. Хотя может быть трудно измерить время для дополнений 2432902008176640000. - Кажется, что целью упражнения может быть представление о различных алгоритмических сложностях, а не о времени произвольной операции. – UncleBens

+0

Я вижу, что вы абсолютно не знаете, что такое C. Позвольте мне дать вам подсказку: у него нет ''. – Puppy

+0

Да, это означало объяснить большую О. –

ответ

3

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

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

1

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

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

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

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

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

1

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

4

Лучше, чем 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; 
} 
+1

Имейте в виду, что 'clock()' измеряет время процессора, а не время настенных часов, что, вероятно, означает, что в этом случае лучше. –

2

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