Отслеживание времени выполнения задачи в C (игнорирование времени приостановлено) - PullRequest
0 голосов
/ 20 февраля 2019

Я должен отслеживать, как долго выполняется задание.Я работаю над Linux, но у меня нет доступа к самому ядру.

Моя задача просто занята циклами, пока процесс не будет выполняться в течение определенного времени.Тогда процесс должен выйти из этого цикла.

У меня была несколько рабочая версия, которая использовала clock_gettime() из time.h.Я сохранил время, начиная с Epoch, прямо перед тем, как занялся циклом, в переменной «start».Затем в каждой итерации цикла я снова проверял время с начала эпохи в другой переменной, называемой current.

О каждой итерации цикла я брал разницу между «текущим» и «стартовым».Если эта разница была больше или равна запрошенному времени выполнения, я вышел из цикла.

Проблема в том, что clock_gettime() не влияет на приостановку задачи.Поэтому, если моя задача приостанавливается, то, как я сейчас это делаю, будет обрабатывать время, в течение которого задача приостановлена, как если бы она все еще выполнялась.

У кого-нибудь есть альтернатива clock_gettime(), которая позволит таймеру как-то игнорировать время приостановки?Код моего текущего метода ниже.

//DOES NOT HANDLE TASK SUSPENSION 
#include <time.h> 
#define BILLION 1E9

//Set execution time to 2 seconds
double executionTime = 2; 

//Variable used later to compute difference in time
double  elapsedTime = -1;

struct timespec start;
struct timespec current;

//Get time before we busy-loop
clock_gettime(CLOCK_REALTIME, &start);

int i; 
for (i = 0; i < 10000000000; i++)
{
    //Get time on each busy-loop iteration
    clock_gettime(CLOCK_REALTIME, &current);

        elapsedTime = (current.tv_sec - start.tv_sec) + ((current.tv_nsec - start.tv_nsec) / BILLION);

        //If we have been executing for the specified execution time, break. 
        if (elapsedTime >= executionTime)
        {
            break;
        }
    } 

1 Ответ

0 голосов
/ 20 февраля 2019

Изменение CLOCK_REALTIME на CLOCK_PROCESS_CPU_TIME.
с использованием sleep() занимает несколько секунд, чтобы накопить небольшое количество процессорного времени.

#include <stdio.h>
#include <unistd.h>
#include <time.h>
#define BILLION 1E9
int main ( void) {
    double executionTime = 0.0001;

    double  elapsedTime = -1;
    double  elapsedTimertc = -1;

    struct timespec startrtc;
    struct timespec start;
    struct timespec currentrtc;
    struct timespec current;

    clock_gettime(CLOCK_REALTIME, &startrtc);
    clock_gettime(CLOCK_PROCESS_CPUTIME_ID, &start);

    for (;;)
    {
        sleep ( 1);
        clock_gettime(CLOCK_REALTIME, &currentrtc);
        clock_gettime(CLOCK_PROCESS_CPUTIME_ID, &current);

        elapsedTime = (current.tv_sec - start.tv_sec) + ((current.tv_nsec - start.tv_nsec) / BILLION);
        elapsedTimertc = (currentrtc.tv_sec - startrtc.tv_sec) + ((currentrtc.tv_nsec - startrtc.tv_nsec) / BILLION);

        if (elapsedTime >= executionTime)
        {
            break;
        }
    }
    printf ( "elapsed time %f\n", elapsedTime);
    printf ( "elapsed time %f\n", elapsedTimertc);
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...