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

ven*_*rty -1 c++ unix

我正在阅读关于高分辨率计时器以检查给定功能所花费的时间.我找到了以下代码

double apHiResElapsedTime::sec () const
{
  struct timeval t;
  gettimeofday (&t, 0);

  double now = 1.e-6 * t.tv_usec + t.tv_sec;

  return (now - starting_);
}
Run Code Online (Sandbox Code Playgroud)

我的问题1.e-6在这里意味着什么?为什么作者正在做1.e-6*t.tv_usec + t.tv_sec.

在这里请求你的帮助.

谢谢你的时间和帮助.

小智 6

1.e-6科学记数法中的数字,等于10 ^ -6,或者 0.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(float,double类型).只需坚持使用两个整数即可.例如,如果您正在使用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));
}
Run Code Online (Sandbox Code Playgroud)

希望能帮助到你.祝好运!