2013-08-09 5 views
-1

Я читаю о таймере высокого разрешения, чтобы проверить время, затраченное данной функцией. Я нашел следующий кодтаймер с высоким разрешением в C++

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.

Запросите вашу помощь здесь.

Спасибо за ваше время и помощь.

+2

1.e-6 - научная нотация. Конечный пользователь преобразует t.tv_usecs в секунды. – IdeaHat

+1

1.e-6 означает 1.0 X 10^-6 или 0.000001 – jsp

ответ

6

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)); 
} 

Надеется, что это помогает. Удачи!

+0

Спасибо за подробное объяснение – venkysmarty

+0

, вы должны принять его ответ, если он ответит на ваш вопрос. –