Путаница с измерениями времени - PullRequest
0 голосов
/ 21 февраля 2019

Мне было поручено реализовать три разные функции get_current_time_seconds1, 2 и 3, а затем я должен оценить разрешение различных функций.Как бы я оценил это?

Какую функцию синхронизации вы бы предложили использовать?Что означают опции компилятора -O0 -lrt, когда мне нужно скомпилировать с помощью gcc -O0 -lrt timer.c -o синхронизации?

#define BILLION 1000000000L

#define LIMIT_I 1000
#define LIMIT_J 1000

double get_current_time_seconds1()
{
    /* Get current time using gettimeofday */
    time_t t = time(NULL);
    struct tm *tm = localtime(&t);
    printf("%s\n", asctime(tm));
    return (double) tm;
}

double get_current_time_seconds2()
{
    struct timespec start,stop;
    clock_gettime(CLOCK_REALTIME, &start);
    clock_gettime(CLOCK_REALTIME, &stop);
    double x = (stop.tv_sec - start.tv_sec) + (stop.tv_nsec - start.tv_nsec);

    printf("%lf\n", x);

    return (double) x;
}

double get_current_time_seconds3()
{
    uint64_t diff;

    struct timespec start, end;

    clock_gettime(CLOCK_MONOTONIC, &start);
    sleep(5);
    clock_gettime(CLOCK_MONOTONIC, &end);

    diff = BILLION * (end.tv_sec - start.tv_sec) + end.tv_nsec - start.tv_nsec;
    printf("elapsed time = %llu nanoseconds\n", (long long unsigned int)diff);

    return (double) diff;
}

1 Ответ

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

Как бы я оценил это?Какую функцию синхронизации вы бы предложили использовать?

Если вы хотите получить разрешение (точность) различных элементов синхронизации, вы можете использовать функцию clock_getres, передаваяв различных CLOCK_ идентификаторах, например:

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

static void printres(clockid_t id)
{
    struct timespec ts;
    int rc = clock_getres(id, &ts);
    printf("clock id: %d\n", (unsigned int)id);
    if (rc != 0) {
        printf("Error: %d\n", rc);
        return;
    }
    printf("tv_sec = %lu\ntv_nsec = %lu\n", ts.tv_sec, ts.tv_nsec);
}

int main(int argc, char** argv)
{
    printres(CLOCK_REALTIME);
    printres(CLOCK_MONOTONIC);
    printres(CLOCK_PROCESS_CPUTIME_ID);
    printres(CLOCK_THREAD_CPUTIME_ID);
    return 0;
}

В моей системе tv_nsec для всех, кроме CLOCK_THREAD_CPUTIME_ID, равно 1000, для CLOCK_THREAD_CPUTIME_ID значение для tv_nsec равно1, это означает, что точность для других типов часов составляет 1 миллисекунду (1000 наносекунд), тогда как точность CLOCK_THREAD_CPUTIME_ID составляет 1 наносекунду.

Для вашей первой функции, которая вызывает localtime точность для этого была бы 1 секунда, поскольку эта функция вычисляет время от эпохи Unix в секундах.

Что означают опции компилятора -O0 -lrt, когда мне приходится компилировать с gcc-O0 -lrt times.c -o хронометраж?

Для некоторых компиляторов, таких как gcc и clang, опция -O означает оптимизацию кода при компиляции до указанного уровня, поэтому-O0 означает , а не для оптимизации кода на всехl, это обычно полезно при отладке кода.

Опция -l говорит, что компилируется с указанной библиотекой, поэтому -lrt говорит, что компилируется с использованием библиотеки rt или "библиотеки реального времени";это необходимо в некоторых системах, так как CLOCK_REALTIME может быть определено в этой библиотеке.

Я надеюсь, что это может помочь.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...