C++中的高分辨率定时器

high resolution timer in C++

本文关键字:定时器 高分辨率 C++      更新时间:2023-10-16

我正在阅读关于高分辨率计时器的文章,以检查给定函数所用的时间。我发现以下代码

double apHiResElapsedTime::sec () const
{
  struct timeval t;
  gettimeofday (&t, 0);
  double now = 1.e-6 * t.tv_usec + t.tv_sec;
  return (now - starting_);
}

我的问题是,1.e-6的价值在这里意味着什么?以及作者为什么要做1.e-6*t.tv_usec+t.tv_sec.

请在此处请求您的帮助。

谢谢你的时间和帮助。

1.e-6是科学记数法中的一个数字,等于10 ^ -60.000001,类型为double。你可以把它读成"十到负六"。

由于gettimeofday()将时间返回为两个独立的整数(秒和微秒),因此通过将整数微秒值除以一百万,微秒部分将转换为表示秒的双值。然后,将整秒(tv_sec)添加到结果中。

例如,假设gettimeofday()返回6秒5微秒,则此代码将执行5 * 0.000001 + 6并产生6.000005秒。

顺便说一句,gettimeofday()并不是真正的高分辨率时钟(当然与计时器无关),它也被弃用。您应该考虑使用clock_gettime()。它支持各种类型的"时钟",并具有纳秒精度。对于性能测量,人们倾向于使用CLOCK_MONOTONIC_RAW标志来访问未经NTP调整的挂钟。请注意,它可能不适用于所有系统。例如,在OS X上,必须使用mach_absolute_time()

我还建议避免使用FPU(浮动,双重类型)。只需使用两个整数即可。例如,如果使用clock_gettime(),则可以计算不带双精度的差值。下面是C99中一个非常简单的例子(我相信你可以很容易地将其转换为C++):

//
// C99 program that demonstrates the usage of `clock_gettime()`
// and shows how to calculate a difference between two timestamps
// in nanoseconds.
//
// $ gcc -Wall -pedantic -std=gnu99 ./test.c -o ./test -lrt
//
#include <time.h>
#include <inttypes.h>
#include <stdio.h>
static int64_t
get_elapsed_time(const struct timespec * restrict start_time,
                 const struct timespec * restrict end_time)
{
    int64_t sec = end_time->tv_sec - start_time->tv_sec;
    int64_t nsec;
    if (end_time->tv_nsec >= start_time->tv_nsec) {
        nsec = end_time->tv_nsec - start_time->tv_nsec;
    } else {
        nsec = 1000000000 - (start_time->tv_nsec - end_time->tv_nsec);
        sec -= 1;
    }
    return sec > 0 ? sec * 1000000000 : 0 + nsec > 0 ? nsec : 0;
}
int main()
{
    struct timespec start_time;
    struct timespec end_time;
    clock_gettime(CLOCK_MONOTONIC_RAW, &start_time);
    puts("Hello!n");
    clock_gettime(CLOCK_MONOTONIC_RAW, &end_time);
    printf("Oh, look! It took me %" PRId64 " nanoseconds to say hi!n",
           get_elapsed_time(&start_time, &end_time));
}

希望能有所帮助。祝你好运