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));
}
希望能帮助到你。祝你好运!