Вычисление времени функции в наносекундах в коде C

Мне нужно знать, как я могу рассчитать время функции в коде C в наносекундах. Я попытался повторить функцию до тех пор, пока не наберется несколько микросекунд. Существуют ли какие-либо другие функции в time.h, которые могут быть использованы для вычисления времени в наносекундах?

Ответ 1

Вы никогда не получите точность наносекунд. Подумайте, о чем вы спрашиваете: на 1 ГГц процессор 1 наносекунда - это тактовый цикл. Независимо от того, что вы пытаетесь вызвать, вы никогда не получите такую ​​точность, вам лучше придерживаться микросекунд. Аналогичный вопрос со многими примерами приведен здесь: С++ кросс-платформенный таймер с высоким разрешением.

Только для c: в окнах вы хотите использовать QueryPerformanceCounter. И здесь больше на QPC. Здесь - связанный вопрос о том, как использовать QueryPerformanceCounter.

Ответ 2

Независимо от того, как вы подходите к этому или тому типу системы/ОС, которые вы используете, вы получаете в лучшем случае приблизительный ответ со значительной дисперсией из-за характера проблемы.

Во-вторых, вам нужна система, поддерживающая этот вид вызова. Это довольно легко, если вы используете QNX Neutrino:

http://www.qnx.com/developers/docs/6.3.0SP3/neutrino/lib_ref/c/clock_gettime.html

/*
 * This program calculates the time required to
 * execute the program specified as its first argument.
 * The time is printed in seconds, on standard out.
 */
#include <stdio.h>
#include <unistd.h>
#include <stdlib.h>
#include <time.h>

#define BILLION  1000000000L;

int main( int argc, char** argv )
  {
    struct timespec start, stop;
    double accum;

    if( clock_gettime( CLOCK_REALTIME, &start) == -1 ) {
      perror( "clock gettime" );
      return EXIT_FAILURE;
    }

    system( argv[1] );

    if( clock_gettime( CLOCK_REALTIME, &stop) == -1 ) {
      perror( "clock gettime" );
      return EXIT_FAILURE;
    }

    accum = ( stop.tv_sec - start.tv_sec )
             + (double)( stop.tv_nsec - start.tv_nsec )
               / (double)BILLION;
    printf( "%lf\n", accum );
    return EXIT_SUCCESS;
  }

Ответ 3

Функция clock в стандартном C для этого не полезна. Обычно он имеет ужасное разрешение, и он несовместим (между платформами) независимо от того, измеряет ли он прошедшее время на стене или время процессора. Вы должны использовать POSIX-стандартную функцию clock_gettime (которая имеет разрешение наносекунд и позволяет указать, на какие часы вы хотите измерить) и эмулировать ее с помощью любых системных операций синхронизации на платформах, которым не хватает функции POSIX.

Ответ 4

Вызвать функцию достаточно, чтобы получить общее время в секундах и использовать любой метод для измерения (даже простой C clock()). Измерение в микро/наносекундах по своей сути слишком неточно.

Для бенчмаркинга вы хотите QueryPerformanceCounter. Это лучший секундомер, доступный в Windows. Смотрите: Как использовать QueryPerformanceCounter? Однако, используя это для измерения (например), вызов по одной функции по-прежнему будет по своей сути очень неточным; Я думаю, вам нужно время на порядок второго итога, чтобы получить хорошее соотношение сигнал/шум для ваших измерений. Сделайте несколько измерений любой требуемой продолжительности и сравните их значение с их стандартным отклонением, чтобы убедиться, что вы достаточно точно измеряете.

Мультимедийные таймеры, вероятно, являются лучшими часами (обратите внимание на разницу между часами и секундомером: один измеряет абсолютное время, только другие временные интервалы) доступный в Windows. Вы должны иметь возможность получить почти миллисекундное разрешение и точность с помощью timeGetTime().