Вычисление времени функции в наносекундах в коде 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().