2015-02-08 3 views
14

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

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

+3

Это может представлять интерес: http://en.cppreference.com/w/cpp/chrono/c/clock – Galik

+0

@Galik сделать ответ из вашей ссылки так, что мы можем проголосовать! – Christophe

+0

@Galik функции выглядят аккуратно, но у меня нет этого заголовка. Можно ли скачать его? – Pilpel

ответ

19

Это не то, что часы считается плохим, обязательно, так как это не определилось работать так, как люди часто думают. А именно, не указано, чтобы произвести . настенный часы, или «реальный», время

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

Во-вторых, не все платформы имп придерживаться такого же поведения; на некоторых платформах реализовано clock(), как если бы оно предназначалось для настенных часов. Таким образом, переносимый код не может использовать его для любой цели.


Однако, одна из причин clock() может считаться плохим, даже для непереносимых использования, является то, что он имеет «тип-небезопасным» API, который не различает между точками времени и времени продолжительности, и которая делает не безопасно управлять единицами времени для вас. Например, используя свой API, можно легко смешать значения, которые должны представлять микросекунды со значениями, предназначенными для представления миллисекунд.

API C++ 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()}}; 
    } 
}; 
+1

Что вы подразумеваете под "wall-clock time"? – Pilpel

+1

Рассмотрим следующий код: 'недействительными FUNC (недействительными * х) { \t в то время как (истинно) {}} силы основных() { \t _beginthread (FUNC, 0, 0); \t while (true) \t \t cout << clock() << endl; } ' Время работы процессора должно увеличиваться в два раза по сравнению с обычной скоростью, но это не так. Зачем? – Pilpel

+0

@Pilpel Наиболее очевидным ответом является то, что код, очевидно, является Windows, а 'clock' в Visual Studios сломан. –

7

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

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

также:

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

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

Смежные вопросы