ctime неправильно получает разницу во времени начала / конца цикла - PullRequest
0 голосов
/ 13 февраля 2019

Я пытаюсь выполнить цикл в течение точного времени, указанного executionTime.Я использую ctime, чтобы получить это время, и мне нужно, чтобы оно было в пределах нескольких миллисекунд точности (что, я считаю, так).Как только этот цикл выполняется в течение указанного времени выполнения, он должен прерваться.

Моя проблема связана с временем выполнения 0,5, результат печати равен 1. После дальнейшего тестирования оказывается, что моя программа округляет время выполнения до ближайшего целого числа.Таким образом, для 4.5 executionTime время печати составляет 5.0000000.Мой код ниже.Я не уверен, откуда эта ошибка.

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

int main() 
{
    float  executionTime = 4.5; 
    int i;
    float  timeDifference = -1;  
    time_t t1;
    time_t t2;

    t1 = time(0);

    for (i = 0; i < 1000000000; i++) 
    {
        t2 = time(0); 

        timeDifference = difftime(t2, t1); 

        if (timeDifference >= executionTime) 
        { 
            break; 
        }

    }

    printf("time difference is: %f\n", timeDifference); 

    return 0; 

}

NEW VERSION пытается использовать clock_gettime.В этой версии проблема не прерывается, когда по циклу по какой-то причине достигается время выполнения.

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

#define BILLION 1E9 

int main()
{
    float  executionTime = 4.5;
    int i;
    float  elapsedTime = -1;

    struct timespec start;
    struct timespec stop;

    //Get starting time 
    clock_gettime(CLOCK_REALTIME, &start);

    for (i = 0; i < 1000000000; i++)
    {
        //Get current time
        clock_gettime(CLOCK_REALTIME, &stop);

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

        if (elapsedTime >= executionTime)
        {
            break;
        }
    }

    printf("time difference is: %f\n", elapsedTime);

    return 0;

}

Ответы [ 2 ]

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

clock_gettime может использоваться для получения большей точности.
Вызовите delay со значением больше 0, чтобы установить время задержки, затем с -1, чтобы проверить истекшее время.
Вызов clock_gettimeв основном даст прошедшее время в основном.

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <unistd.h>
#include <time.h>

#define BILLION  1E9

int delay ( double seconds)
{
    static double usec = 0.0;
    double elapsed = 0.0;
    static struct timespec start;
    struct timespec stop;

    if ( 0.0 <= seconds) {
        usec = seconds;
        clock_gettime ( CLOCK_REALTIME, &start);
        return 0;
    }
    clock_gettime ( CLOCK_REALTIME, &stop);
    elapsed = difftime ( stop.tv_sec, start.tv_sec);
    elapsed += ( stop.tv_nsec - start.tv_nsec) / BILLION;
    if ( ( elapsed < usec)) {
        return 1;
    }
    return 0;
}

int main() {

    double  executionTime = 4.5;
    int i;
    double  timeDifference = -1;
    struct timespec end;
    struct timespec begin;

    clock_gettime ( CLOCK_REALTIME, &begin);
    delay( executionTime);//call to set time

    for (i = 0; i < 1000000000; i++)
    {
        if ( !delay( -1)) {//call to check elapsed time
            break;
        }
    }
    clock_gettime ( CLOCK_REALTIME, &end);
    timeDifference = difftime ( end.tv_sec, begin.tv_sec);
    timeDifference += ( end.tv_nsec - begin.tv_nsec) / BILLION;

    printf("time difference is: %f\n", timeDifference);

    return 0;
}
0 голосов
/ 13 февраля 2019

time() возвращается к ближайшей секунде, а difftime() возвращает их разницу.Так что в основном эта функция вычисляет разницу от целых чисел.Для более точной оценки вы можете использовать clock()

time_t. Цель - измерение календарного времени

int main() 
{
    float  executionTime = 1.3; 
    int i;
    double  timeDifference = 1.0;  
    clock_t t1;
    clock_t t2;

    t1 = clock();

    for (i = 0; i < 1000000000; i++) 
    {
        timeDifference = (double)(clock() - t1) / CLOCKS_PER_SEC;

        if (timeDifference >= executionTime) 
        { 
            break; 
        }

    }

    printf("time difference is: %.9g\n", timeDifference); 

    return 0; 

}
.
...