C中的高精度时间测量

时间:2013-08-24 09:43:23

标签: c linux

我正试图找出一种编写一些代码的方法,这些代码可以准确地计算出在BST上执行搜索所需的时间。目前即时使用时间和元素总数的顺序为10 ^ 5。它看起来如下: -

clock_t begin, end;
begin = clock();
...
...
...
end = clock();
difference = (end-begin)/CLOCKS_PER_SECOND;

然而,这并没有给我提供我正在寻找的精确度。我可以使用其他任何libc函数吗?

6 个答案:

答案 0 :(得分:2)

要对您的算法进行基准测试,您需要进行一些重复以达到至少几百毫秒的范围。 (这是标准做法)。要仅对用户空间中发生的算法进行基准测试(无线程,系统调用等),您需要使用getrusage(RUSAGE_SELF, &r)并使用包含秒和微秒的r.ru_utime值。

答案 1 :(得分:2)

如果您的库支持它,C11的timespec_get()最长可达纳秒,具体取决于您的系统时钟分辨率。

答案 2 :(得分:1)

如果您使用Intel CPU运行基准测试。也许您可以尝试RDTSC和RDTSCP指令。

here is a document about the instructions

答案 3 :(得分:0)

BST?你想要什么样的精度?在32位系统上将CLOCKS_PER_SECOND除以10 ^ 6应该得到6位数的精度?

你是否将结果转换为双倍?

尝试

difference = (double)(end-begin)/CLOCKS_PER_SECOND;

请注意,差异应该能够保持双倍。

答案 4 :(得分:0)

Qt有QElapsedTimer,支持测量高达纳秒。我无法证明它是多么准确,IIRC它在不同的平台上使用不同的实现。可悲的是它是C ++,可能不适合你。也:

  

在不提供纳秒分辨率的平台上,值   返回将是可用的最佳估计。

clock()功能适用于粗略测量,但它可以在毫秒范围内工作。与其名称相反,我不认为它在CPU时钟中测量,因为现代处理器的时钟频率可能会有很大差异,因此无法仅依靠CPU时钟准确地确定实际时间。 IMO这个概念可以追溯到CPU频率不变的时代,没有电源管理,没有“turbo boost”自动超频或者无论如何。

编辑:也找到了这个(time.h):

    int clock_gettime(clockid_t clk_id, struct timespec *tp);

    ... and the target struct...

    struct timespec {
            time_t   tv_sec;        /* seconds */
            long     tv_nsec;       /* nanoseconds */
    };

... and the clock options...


CLOCK_REALTIME
    System-wide realtime clock. Setting this clock requires appropriate privileges. 
CLOCK_MONOTONIC
    Clock that cannot be set and represents monotonic time since some unspecified starting point. 
CLOCK_PROCESS_CPUTIME_ID
    High-resolution per-process timer from the CPU. 
CLOCK_THREAD_CPUTIME_ID
    Thread-specific CPU-time clock. 

答案 5 :(得分:0)

你所做的与我最近做的非常相似。

我认为int gettimeofday(struct timeval *tv, struct timezone *tz);功能适合您的需要。时间信息将被放入struct timeval tv,它以秒和微秒获得时间。手册页中的struct timeval

struct timeval {
               time_t      tv_sec;     /* seconds */
               suseconds_t tv_usec;    /* microseconds */
};

使用gettimeofday进行时间测量的简短示例:

struct timeval time;
if(gettimeofday( &time, 0 )) return -1;

long cur_time = 1000000 * time.tv_sec + time.tv_usec;
double sec = cur_time / 1000000.0;

较长的示例已经简化并轻松包装为c ++类以方便使用。代码已放在我的github上:https://github.com/lulyon/LinuxTimeCounter,它在真实世界的项目中使用。