c - 试图获取操作时间和接收时间 0 秒

标签 c time

我正在尝试查看将大约 10000 个名称插入 BST(用 c 语言编写)需要多少时间。

我正在使用 fscanf 从 txt 文件中读取这些名称。我在主函数中声明了一个文件指针(fp)。调用另一个 .c 文件中的函数,通过其参数传递 fp。我想计算插入 2,4,8,16,32...,8192 个名称所需的时间,以节省在长 double 组中的时间。我在函数所在的 .c 文件中包含了 time.h 库。

代码:

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;
    }

我得到这个:

Last value of ttemp is 0.000000
Time after 2 names is 0.000000 sec
Time after 4 names is 0.000000 sec
Time after 8 names is 0.000000 sec
Time after 16 names is 0.000000 sec
Time after 32 names is 0.000000 ms
Time after 64 names is 0.000000 sec
Time after 128 names is 0.000000 sec
Time after 256 names is 0.000000 sec
Time after 512 names is 0.000000 sec
Time after 1024 names is 0.000000 sec
Time after 2048 names is 0.000000 sec
Time after 4096 names is 0.000000 sec
Time after 8192 names is 0.000000 sec
Time after 16384 names is 0.010000 sec

我做错了什么? :S

最佳答案

使用 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() 的许多倍数,除非你希望它完全是谎言。

关于c - 试图获取操作时间和接收时间 0 秒,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6169715/

相关文章:

c - 加载使用另一个共享库的共享库

c - 在 C 中保存多维数组

php - 处理 csv、bash、php、c/c++ 的最快处理速度

java - 测量 Servlet 的总网络传输时间

c - 如何在 C 中实现时钟例程

c - 用 C 语言编写带有哨兵和结构类型的动态双链表

c - 如何在 C 中检查 NULL 指针?

javascript - 无论本地时区如何,都获得赫尔辛基本地时间

windows - 强制 Windows *现在*更新文件访问时间的方法?

Java Swing : Set starting time on timer and loop it