1.e-6
представляет собой число в scientific notation, которая равна 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));
}
Надеется, что это помогает. Удачи!
1.e-6 - научная нотация. Конечный пользователь преобразует t.tv_usecs в секунды. – IdeaHat
1.e-6 означает 1.0 X 10^-6 или 0.000001 – jsp