Являются ли часы () надежными для таймера?

Я использую функцию clock (), и мне интересно, сбрасывается ли она когда-либо или максимально увеличивается. все, что я использую для этого, — это слишком подчинить его предыдущему вызову функции и найти разницу.

Спасибо за помощь до сих пор, но я не могу заставить работать хронограф в VS ’12, но это нормально, потому что я думаю, что это немного больше, чем мне нужно в любом случае, я думал об использовании time (), но я понятия не имеете, как преобразовать t_time в int, который содержит только текущие секунды 0-60, любая помощь?

1

Решение

Что касается стандарта,

Диапазон и точность времен, представимых в clock_t а также time_t определяются реализацией.

(C99, §7.23.1 №4)

таким образом, нет никаких гарантий диапазона; определение clock() ничего не говорит об обтекании, хотя говорит, что

Если используемое время процессора недоступно или его значение не может быть представлено, функция возвращает значение (clock_t)(-1)

Таким образом, мы можем сказать, что превышение диапазона clock_t может рассматриваться как «его значение не может быть представлено»; с другой стороны, эта интерпретация будет означать, что через некоторое время clock() становится совершенно бесполезным.

Фактически, если мы перейдем к конкретной реализации (glibc), мы увидим:

matteo@teokubuntu:~$ man 3 clock
   Note that  the  time  can  wrap  around.   On  a  32-bit  system  where
CLOCKS_PER_SEC  equals 1000000 this function will return the same value
approximately every 72 minutes.
3

Другие решения

Зависит от того, на какой системе вы находитесь. Может использовать 32+ или 64-бит clock_t, Он определенно перевернется, но если он будет 64-битным, все будет хорошо в течение некоторого времени, прежде чем перевернется — 264 микросекунды по-прежнему ужасно долго (около 244 секунд, и есть около 216 секунд в день, так 228 дней — около 220, или миллион лет …;)

Конечно, в 32-битной системе у нас есть около 212= 4096 секунд при микросекундном разрешении. Час 3600 с = около 1х10м.

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

И конечно, хотя CLOCKS_PER_SEC может быть 1000000, это не значит, что вы получаете микросекундное разрешение — во многих системах он «скачет» 10000 единиц за раз.

Подводя итог, «вероятно, плохая идея».

Если у вас есть C ++ 11 в системе, используйте std::chrono, который имеет несколько вариантов хронометража, которые достаточно хороши для большинства целей (но изучают std::chrono документы)

Пример кода:

#include <iostream>
#include <chrono>
#include <unistd.h>  // replace with "windows.h" if needed.

int main()
{
std::chrono::time_point<std::chrono::system_clock> start, end;

start = std::chrono::system_clock::now();
// 10 seconds on a unix system. Sleep(10000) on windows will be the same thing
sleep(10);
end = std::chrono::system_clock::now();

int elapsed_seconds = std::chrono::duration_cast<std::chrono::seconds>
(end-start).count();
std::cout << "elapsed time: " << elapsed_seconds << "s\n";
}
1

Простой ответ заключается в том, что если вы просто используете его для определения времени функции, она, вероятно, не обернется. Это также может быть слишком медленно, и есть вероятность, что вы увидите длительность функции, равную нулю. Если вам нужна точная синхронизация для функции, которая выполняется быстро, вам лучше использовать вызов уровня ОС, например этот на Windows.

0