Использование clock () в качестве таймера в c - PullRequest
0 голосов
/ 26 сентября 2019

У меня есть следующие три основные строки кода, чтобы увидеть, правильно ли синхронизируется clock:

#include <unistd.h>
#define wait(seconds) sleep( seconds )

printf("%lu\n", clock());
wait(2);
printf("%lu\n", clock());

wait(), кажется, работает нормально - как при запуске,«чувствует», как будто это пауза на 2 с.

Однако вот что дает команда печати:

253778

253796

И поэтому, когда я делаю что-то вроде:

(double) (clock() - t0) / CLOCKS_PER_SEC

Это дает мне бесполезные результаты.

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

Ответы [ 2 ]

3 голосов
/ 26 сентября 2019

ISO C говорит, что функция "clock возвращает наилучшее приближение реализации к времени процессора, используемому программой с начала определенной эпохой реализации, связанной только с вызовом программы."

Другими словами, это не часы реального времени.

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

ISO C предоставляет функцию time, которая предназначена для предоставления календарного времени, закодированного как арифметическое значение time_t.Функция difftime вычисляет разницу между двумя значениями time_t как значение с плавающей запятой типа double, измеряющее секунды.Во многих системах точность time_t не лучше, чем одна секунда, однако.

Существуют функции POSIX для более точного времени разрешения, такие как gettimeofday или clock_gettime (с подходящим аргументом типа часов).

2 голосов
/ 26 сентября 2019

Если вы прочитали справочную страницу для clock(), в примечаниях вы увидите следующее:

В некоторых других реализациях возвращаемое значениеby clock () также включает в себя время всех детей, чей статус был получен с помощью wait (2) (или другого вызова типа wait).Linux не включает время ожидания детей в значение, возвращаемое clock ().Функция times (2), которая явно возвращает (отдельную) информацию о вызывающем абоненте и его дочерних элементах, может быть предпочтительной.

Так что clock() не всегда включает время, затраченное на что-то вроде wait() на всех реализациях.Если вы работаете в Linux, вы можете взглянуть на функцию times(), определенную в sys/times.h, поскольку она возвращает структуру, включающую время (в тиках часов), взятое детьми (таким образом, такие функции, как wait()в комплекте).

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