Как измерить время в c для численного интегрирования в реальном времени? - PullRequest
0 голосов
/ 09 мая 2018

Я пытаюсь написать код c, в котором некоторые числовые вычисления, содержащие производные по времени, должны выполняться в режиме динамической системы в реальном времени. Для этой цели мне нужна максимально точная оценка времени от одного цикла к следующему в переменной с именем "dt":

static clock_t prev_time;
prev_time = clock();
while(1){
    clock_t current_time = clock();
    //do something
    double dt = (double)(current_time - prev_time)/CLOCKS_PER_SEC;
prev_time = current_time;
}

Однако, когда я тестирую этот код, интегрируя (непрерывно добавляя) dt, т.е.

static double elapsed_time = 0;
//the above-mentioned declaration and initialization in done here
while(1){
   //the above-mentioned code is executed here
   elapsed_time += dt;
   printf("elapsed_time : %lf\n", elapsed_time);
}

Я получаю результаты, которые значительно ниже, чем реальность, с коэффициентом, который является постоянным во время выполнения, но, кажется, изменяется, когда я редактирую несвязанные части кода (он колеблется между 1/10 и примерно половиной фактического времени).

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

Но я не уверен, так ли это. Кроме того, я не мог найти другой способ точно измерить время.

Кто-нибудь, почему это происходит?

РЕДАКТИРОВАТЬ: код компилируется и выполняется на Raspberry Pi 3, и используется для реализации контроллера обратной связи

Ответы [ 2 ]

0 голосов
/ 11 июня 2018

ОБНОВЛЕНИЕ: Как выясняется, clock() не подходит для численных расчетов в реальном времени, поскольку учитывает только время, используемое на процессоре. Я решил проблему с помощью функции clock_gettime(), определенной в <time.h>. Это возвращает глобальное время с разрешением наносекунды (конечно, это происходит с определенной ошибкой, которая зависит от вашего разрешения часов, но это примерно лучшее, что есть).

На удивление трудно было найти ответ, поэтому спасибо Иану Эбботу за очень полезную помощь

0 голосов
/ 09 мая 2018

Кто-нибудь, почему это происходит?

clock измеряет время процессора, то есть количество временных интервалов / тактов, затраченных процессором на ваш процесс. Это полезно, когда вы выполняете микробенчмаркинг, так как вы часто не хотите измерять время, которое ЦП фактически потратил на другие процессы в микробенчмарке, но бесполезно, когда вы хотите измерить, сколько времени фактически проходит между событиями.

Вместо этого вы должны использовать время или gettimeofday для измерения времени настенных часов.

...