Проблема производительности с четкими и точными интервалами чтения в C - PullRequest
1 голос
/ 01 апреля 2020

У меня проблема с чтением значений в разные промежутки времени относительно производительности. Существует требование, например, читать значения во второй раз, то есть ровно 60 раз в минуту. Другим требованием является чтение разных значений в разные промежутки времени. Чтение может занять неопределенное время, и программа должна заняться этим. Среда - Debian с архитектурой armhf.

Сначала я создал al oop, который использовал такты (в секунду). Однако использование макроса CLOCKS_PER_SE C с функцией clock () и подсчет тиков приводят к тому, что программа использует несколько секунд, когда было достигнуто значение CLOCKS_PER_SE C.

Использование clock_gettime () Функция дает правильное l oop относительно времени. Я считаю, что циклы, пока не будет достигнут временной интервал, не очень эффективны. Кроме того, я полагаю, что будут проблемы с несколькими потоками, считающими разные интервалы времени, например, один поток читает значения каждую секунду, а другой поток читает значения 10 раз в секунду, и еще один поток читает значения 6 раз в минуту. Я включил фрагмент кода, как чтение значений каждую секунду развивается с помощью clock_gettime ().

Есть ли другой способ для l oop через (или ждать) требуемое время? Или я должен разработать один единственный l oop, который проверяет каждую миллисекунду, есть ли какое-либо значение для чтения?

#include<stdio.h>
#include<time.h>

/* reading values from source here */
void read_values()
{
    printf("Reading values should happen here.\n");
}

int main()
{
    int loop_counter = 0; /* counter how many times runs the inner while loop */
    struct timespec beginning, now;
    clock_gettime(CLOCK_REALTIME, &now);

    /* reading values continuously each second */
    while (1)
    {
        beginning.tv_sec = now.tv_sec;
        printf("Loop beginning in Unix time %ld.\n", beginning.tv_sec);
        read_values();

        /* loops until one second has passed */
        while (now.tv_sec == beginning.tv_sec)
        {
            /* loops here and uses resources,
            likely performance issue here */
            clock_gettime(CLOCK_REALTIME, &now);
            loop_counter++;
        }
        printf("Run %d times in inner while loop.\n", loop_counter);
        loop_counter=0;
    }
}
...