Я использую функцию clock (), и мне интересно, сбрасывается ли она когда-либо или максимально увеличивается. все, что я использую для этого, — это слишком подчинить его предыдущему вызову функции и найти разницу.
Спасибо за помощь до сих пор, но я не могу заставить работать хронограф в VS ’12, но это нормально, потому что я думаю, что это немного больше, чем мне нужно в любом случае, я думал об использовании time (), но я понятия не имеете, как преобразовать t_time в int, который содержит только текущие секунды 0-60, любая помощь?
Что касается стандарта,
Диапазон и точность времен, представимых в
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.
Зависит от того, на какой системе вы находитесь. Может использовать 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";
}
Простой ответ заключается в том, что если вы просто используете его для определения времени функции, она, вероятно, не обернется. Это также может быть слишком медленно, и есть вероятность, что вы увидите длительность функции, равную нулю. Если вам нужна точная синхронизация для функции, которая выполняется быстро, вам лучше использовать вызов уровня ОС, например этот на Windows.