Почему часы() считаются плохими?

Мне когда-то советовали использовать зависящий от платформы метод (GetTickCount() для Windows) для получения времени вместо использования clock(), потому что это плохо или ненадежно. Зачем? Также есть функции заголовка <chrono>, которые многие считают, однако, я не могу найти его в своей среде IDE (VS 2010).

Моя цель - развитие игры, если это имеет значение.

Ответ 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()}};
    }
};

Ответ 2

В соответствии с: cppreference.com: std:: clock().

"std:: clock time может продвигаться быстрее или медленнее, чем настенные часы, в зависимости от ресурсов выполнения, предоставленных программе операционная система. Например, если ЦП совместно используется другим процессы, std:: clock time может продвигаться медленнее, чем настенные часы. На другой рукой, если текущий процесс многопоточен и более одного доступно исполнение, время std:: clock может продвигаться быстрее, чем настенные часы."

И

"Значение, возвращаемое clock(), может Реализации. Например, на машине с 32-битным std:: clock_t, он обертывается через 2147 секунд или 36 минут."

Надеюсь, что это поможет.