C Программирование времени и функций часов - PullRequest
0 голосов
/ 08 декабря 2018

Я работаю над ядром Linux 4.4 (Ubuntu) и сравниваю вывод между функцией times (в sys / times.h) и функцией clock (в time.h).

Согласно справочным страницам, times должен возвращать "процессорное время", используемое программой, начиная с некоторого произвольного времени (но это произвольное время должно быть согласованным между вызовами функции).

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

В приведенном ниже коде каждый из этих вызовов используется для вывода количества времени, которое требуется для выполнения произвольной работы.Кажется, что эти времена должны выстроиться в линию, но они всегда кажутся отключенными в 10 000 раз.

#include <stdio.h>
#include <unistd.h>
#include <sys/times.h>
#include <time.h>

int main() {
    struct tms times_start, times_end;
    clock_t times_start_retval, times_end_retval;
    clock_t clock_start, clock_end;

    /* clock called first and last, so estimates using "clock" should be
       slightly longer than estimates using "times" */
    if((clock_start = clock()) == -1) {
        perror("starting clock");
        return -1;
    }

    if((times_start_retval = times(&times_start)) == -1) {
        perror("starting times");
        return -1;
    }

    for(int i = 100000000; i; i--); // do work

    if((times_end_retval = times(&times_end)) == -1) {
        perror("ending timer");
        return -1;
    }

    if((clock_end = clock()) == -1) {
        perror("ending clock");
        return -1;
    }

    printf("Times using the clock system call\n");
    printf("clock start: %li\nclock end: %li\n", clock_start, clock_end);
    printf("elapsed: %li\n\n", clock_end - clock_start);

    printf("Times using the times system call\n");
    printf("System start: %li\nUser start: %li, start retval: %li\n",
        times_start.tms_stime, times_start.tms_utime, times_start_retval);
    printf("System end:   %li\nUser end:   %li, end retval:   %li\n",
        times_end.tms_stime, times_end.tms_utime, times_end_retval);
    printf("elapsed: %li\n\n", times_end_retval - times_start_retval);

    return 0;
}

Результат:

Times using the clock system call
clock start: 5016
clock end: 321323
elapsed: 316307

Times using the times system call
System start: 0
User start: 0, start retval: 1733759140
System end:   0
User end:   31, end retval:   1733759172
elapsed: 32

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

1 Ответ

0 голосов
/ 08 декабря 2018

Возможно, мне просто нужно было задать вопрос.Я думаю, что только что нашел ответ в Интерфейс программирования Linux (Kerrisk 2011, стр. 206-207).Ответом является то, что «процессорное время» измеряется двумя различными способами.

раз возвращает время, измеренное в «тактах». Количество тактов в секунду можно получить, используя sysconf(_SC_CLK_TCK) и длямоя система равна 100. Таким образом, каждый такт составляет около 1/100 секунды.

часы возвращают время, измеренное в «тактах в секунду». По-видимому, для Unix-совместимых систем это всегда должно быть 1 000 000.когда я печатаю CLOCKS_PER_SEC из заголовочного файла time.h, это то, что я получаю в своей системе.

Чтобы получить количество секунд, я должен разделить возвращаемое значение clock на 1 000 000 или разделить times возвращаемое значение на 100. Это означает, что на каждый «такт» приходится 10000 «часов». Это, кажется, объясняет коэффициент разницы в 10000, который я видел.

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