Ответ 1
Это не то, что часы считаются плохими, обязательно, настолько, насколько это не определено, чтобы управлять тем, как люди часто это считают. А именно, он не указывается для создания настенных часов или "реального" времени.
clock()
определяется, сколько процессорного времени используется; использование большего количества потоков использует больше времени процессора, а спальные потоки используют меньше времени.
Во-вторых, не все платформы реализуют одно и то же поведение; на некоторых платформах реализовано clock()
, как если бы оно предназначалось для настенных часов. Таким образом, переносимый код не может использовать его для любой цели.
Однако одна из причин clock()
может считаться плохим, даже для непереносимых применений, заключается в том, что у нее есть API-интерфейс типа "небезопасный", который не проводит различие между временными точками и продолжительностью времени и не безопасно управлять единицами времени для вас. Например, используя свой API, можно легко смешать значения, которые должны представлять микросекунды со значениями, предназначенными для представления миллисекунд.
API С++ 11 <chrono>
намного лучше об этом. Одна проблема заключается в том, что <chrono>
не имеет тактового времени процессора. Если вы хотите настенные часы, тогда std::chrono::steady_clock
- лучший выбор; Он имеет API-интерфейс типа "безопасный", и он определен, чтобы продвигаться "с постоянной скоростью в реальном времени".
http://coliru.stacked-crooked.com/a/6df6c71a436092e3
Спящий 4 потока по 0,1 секунды каждый.
Истекшее время стены: 0,101213 секунд.
Истекшее время процессора: 0 секунд.
Скручивание 4 нитей по 0,1 секунды каждый.
Истекшее время стены: 0.100304 секунд.
Истекшее время процессора: 0,4 секунды.
И для развлечения здесь <chrono>
стиль для использования std::clock()
:
#include <chrono>
#include <ratio>
#include <ctime>
struct cpu_clock {
using rep = std::clock_t;
using period = std::ratio<1, CLOCKS_PER_SEC>;
using duration = std::chrono::duration<rep, period>;
using time_point = std::chrono::time_point<cpu_clock, duration>;
static const bool is_steady = false;
static time_point now() noexcept {
return time_point{duration{std::clock()}};
}
};