-1

我正在阅读有关高分辨率计时器的信息,以检查给定函数所花费的时间。我发现以下代码

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

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

  return (now - starting_);
}

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

在这里请求您的帮助。

感谢您的时间和帮助。

4

1 回答 1

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(浮点型、双精度型)。只需坚持使用两个整数。例如,如果您使用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));
}

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

于 2013-08-09T13:22:00.770 回答