我们正在制作一些关于不同排序算法的报告。它们都在工作,但是在打印合并排序的处理时间时出现错误
我写了以下代码
...BubbleSort(arr3,50000);
time(&time_now);
f = difftime(time_now,time_then);
printf("BubbleSort - tempo: %f\n",f);
time(&time_then);
printf("then: %s",ctime(&time_then));
MergeSort(arr4,0,49999);
time(&time_now);
printf("now: %s",ctime(&time_now));
f = difftime(time_now,time_then);
printf("MergeSort - tempo: %f\n",f);
但它总是说时间= 0s用于合并排序
似乎它无法获得当前时间或者mergesort的处理时间非常低(但它有效) 提前谢谢
答案 0 :(得分:7)
您看到零,因为您的MergeSort
非常快,以至于您的系统在可测量的时间间隔内完成。
为您的程序提供更多数据以进行排序应该会有所帮助。或者,您可以更改时间测量机制以获得更精确的信息。但第二种方法依赖于系统。
MergeSort
的执行时间增长为N * log 2 (N),因此要查看与BubbleSort
的时间相当的时间,其增长为N 2 ,你需要给它更多的数据。对于50,000个项目的数组,数学计算大小约为3,000 次。如果您传递MergeSort
大约50,000 * 3,000 = 150,000,000项的数组,则应该会看到打印的非零数字。
注意:不要尝试将那么多数据传递给BubbleSort
- 它需要很长时间才能完成,除非数据已经非常接近于排序。
答案 1 :(得分:6)
不要使用time
来计算程序/算法的运行时间。这是全球系统时间,包括抢占时间和运行后台的其他程序。
使用getrusage
获取代码的资源(CPU时间)使用情况。
#include <stdlib.h>
#include <stdio.h>
#include <sys/resource.h>
#include <sys/time.h>
struct rusage start, end;
getrusage(RUSAGE_SELF, &start);
// run your code
getrusage(RUSAGE_SELF, &end);
struct timeval used_utime, used_stime;
timersub(&end.ru_utime, &start.ru_utime, &used_utime);
timersub(&end.ru_stime, &start.ru_stime, &used_stime);
printf("function ran for %d usec in user mode and %d usec in system mode \n"
, used_utime.tv_sec * 1000 * 1000 + used_utime.tv_usec
, used_stime.tv_sec * 1000 * 1000 + used_stime.tv_usec);
答案 2 :(得分:2)
取决于您是否需要经过时间或CPU时间。以下是两者。
// On Raspberry Pi gcc timing.c -lrt -O3 -o timer
#include <time.h>
#include <stdio.h>
double theseSecs = 0.0;
double startSecs = 0.0;
double secs;
double CPUsecs = 0.0;
double CPUutilisation = 0.0;
double answer = 0;
clock_t starts;
void start_CPU_time()
{
starts = clock();;
return;
}
void end_CPU_time()
{
CPUsecs = (double)(clock() - starts)/(double)CLOCKS_PER_SEC;
return;
}
struct timespec tp1;
void getSecs()
{
clock_gettime(CLOCK_REALTIME, &tp1);
theseSecs = tp1.tv_sec + tp1.tv_nsec / 1e9;
return;
}
void start_time()
{
getSecs();
startSecs = theseSecs;
return;
}
void end_time()
{
getSecs();
secs = theseSecs - startSecs;
return;
}
void calculate()
{
int i, j;
for (i=1; i<100001; i++)
{
for (j=1; j<10001; j++)
{
answer = answer + (float)i / 100000000.0;
}
}
}
void main()
{
start_time();
start_CPU_time();
calculate();
end_time();
end_CPU_time();
CPUutilisation = CPUsecs / secs * 100.0;
printf("\n Answer %10.1f, Elapsed Time %7.4f, CPU Time %7.4f, CPU Ut %3.0f%\n",
answer, secs, CPUsecs, CPUutilisation);
}
答案 3 :(得分:0)
time
函数和time_t
类型粒度通常为秒,因此如果函数返回的时间小于1秒,则diff将为零。
对于快速和脏的基准测试,您可以使用clock()
。