我试图看看将大约10000个名字插入BST需要花多少钱(用c语写)。
我正在使用fscanf从txt文件中读取这些名称。我在main函数中声明了一个文件指针(fp)。调用另一个.c文件中的函数,通过其参数传递fp。我想计算插入2,4,8,16,32 ...,8192名称所需的时间,以节省长双阵列的时间。我已将time.h库包含在函数所在的.c文件中。
代码:
void myfunct(BulkTreePtr *Bulktree, FILE* fp,long double time[])
{
double tstart, tend, ttemp;
TStoixeioyTree datainput;
int error = 0,counter=0,index=0,num=2,i;
tstart = ((double) clock())/CLOCKS_PER_SEC;
while (!feof(fp))
{
counter++;
fscanf(fp,"%s %s", datainput.lname, datainput.fname);
Tree_input(&((*Bulktree)->TreeRoot), datainput, &error);
if (counter == num)
{
ttemp = (double) clock()/CLOCKS_PER_SEC;
time[index] = ttemp-tstart;
num = num * 2;
index++;
}
}
tend = ((double) clock())/CLOCKS_PER_SEC;
printf("Last value of ttemp is %f\n",ttemp-tstart);
time[index] = (tend-tstart);
num = 2;
for(i=0;i<14;i++)
{
printf("Time after %d names is %f sec \n", num, (float)time[i]);
num=num*2;
}
我明白了:
ttemp的最后一个值是0.000000
2个名称后的时间为0.000000秒 4个名称后的时间为0.000000秒
8个名称后的时间为0.000000秒
16个名称后的时间为0.000000秒
32个名称后的时间为0.000000 ms
64个名字后的时间 0.000000 sec
128个名称后的时间为0.000000秒
256之后的时间 名称是0.000000秒后的时间 512个名称是0.000000秒
时间 在1024个名称之后是0.000000秒 2048名后的时间为0.000000秒
4096名后的时间为0.000000 秒号8192名后的时间 0.000000秒
16384名称后的时间为0.010000秒
我做错了什么? :S
答案 0 :(得分:1)
使用clock_getres()和clock_gettime()。很可能你会发现你的系统没有非常快的时钟。请注意,在调用gettimeofday或clock_gettime()时,系统可能会返回不同的数字,但通常(取决于内核)这些大于HZ分辨率的数字是生成模拟时间推进的谎言。
您可能会找到更好的测试来进行固定时间测试。了解您可以在10秒内完成多少次插入。或者使用某种快速重置方法(memset?)并找出在10秒内可以完成的1024个名称的插入组数。
[编辑]
传统上,内核在硬件频率下以HZ频率中断。只有当它得到这个硬件中断时才会知道时间已提前1 / HZ秒。 HZ的传统价值是1/100秒。惊喜,惊喜,你看到了1/100秒的时间增量。现在,一些系统和内核最近开始提供其他方法来获得更高分辨率的时间,查看RTC设备或其他任何方法。
但是,你应该使用我指向你的clock_gettime()函数和clock_getres()函数来找出你获得准确时间更新的频率。确保你的测试运行了很多倍的clock_getres(),除非你想让它成为一个完全谎言。
答案 1 :(得分:0)
clock()返回“ticks”的数量;每秒有CLOCKS_PER_SEC个刻度。对于任何小于1 / CLOCKS_PER_SEC秒的操作,clock()的返回值将保持不变或更改1滴。
从你的结果来看,即使16384次插入也不会超过1/100秒。
如果您想知道一定数量的插入需要多长时间,请尝试重复多次,以便刻度的总数很重要,然后将该总时间除以它们重复的次数。< / p>
答案 2 :(得分:0)
clock
返回使用的cpu时间量,而不是实际经过的时间量,但这可能是你想要的。请注意,Unix标准要求CLOCKS_PER_SECOND
恰好是一百万(1000000),但分辨率可能更差(例如,它一次可能会跳过10000)。如果你想测量花费的cpu时间,或者用单调时钟测量实时花费,你应该使用clock_gettime
和cpu时钟。
答案 3 :(得分:0)
ImageMagick包含诸如此类的秒表功能。
#include "magick/MagickCore.h"
#include "magick/timer.h"
TimerInfo *timer_info;
timer_info = AcquireTimerInfo();
<your code>
printf("elapsed=%.6f sec", GetElapsedTime(timer_info));
但这似乎只有1/100秒的分辨率。另外,它需要安装ImageMagic。我建议这样做。它很简单,在Linux中具有usec分辨率。
#include <time.h>
double timer(double start_secs)
{
static struct timeval tv;
static struct timezone tz;
gettimeofday(&tv, &tz);
double now_secs = (double)tv.tv_sec + (double)tv.tv_usec/1000000.0;
return now_secs - start_secs;
}
double t1 = timer(0);
<your code>
printf("elapsed=%.6f sec", timer(t1));