试图获取操作时间并接收时间0秒

时间:2011-05-29 18:52:44

标签: c time

我试图看看将大约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

4 个答案:

答案 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));