Javier Luis Lopez Ответов: 1

Это же для того чтобы использовать &ЛТ;хронометр&ГТ; + хроно::system_clock::сейчас() против &ЛТ;времени.ч&ГТ; + часы()?


Я использовал и то и другое и имел одинаковую точность.

Оба имеют одинаковый размер в VS: 8 байт.
Таким образом, кажется, что оба имеют одинаковую точность.

Используя high_resolution_clock, можно использовать микросекундную часть.

Так что, возможно, лучше попробовать использовать high_resolution_clock, но если появились ошибки, то используйте старый метод, который проще.

Что я уже пробовал:

cout<<"Size of std::chrono::time_point<std::chrono::system_clock> "<<sizeof(std::chrono::time_point<std::chrono::system_clock>)<<endl;
cout<<"Size of time_t                                             "<<sizeof(time_t)<<endl;

1 Ответов

Рейтинг:
12

Jochen Arndt

Это не одно и то же, потому что std::system_clock это часы реального времени и clock_t возвращенный clock() это процессорное время, основанное на том, что называется монотонными или устойчивыми часами.

Монотонные часы увеличиваются только с фиксированной скоростью, в то время как часы реального времени также могут быть скорректированы (установлены на другое значение) через определенные промежутки времени путем сравнения с другими часами.

Размер бита типа ничего не говорит вам о разрешении или точности. Это особенно относится к временным типам, где даже типы одного и того же размера бита и единицы измерения могут иметь разную точность из-за используемой тактовой реализации.

Если вы хотите измерить и сравнить промежутки времени, вы должны использовать монотонные часы. Для коротких промежутков времени используйте часы с высоким разрешением. Но обратите внимание, что это может иметь то же разрешение, что и clock_t на некоторых системах. Доступное разрешение зависит от операционной системы и аппаратного обеспечения (CPU) и обычно должно измеряться (такие функции, как clock_getres() просто верните разрешение значения времени, которое теоретически является максимальным. достижимое разрешение).


Javier Luis Lopez

В моем компьютере микросекунды=0 при использовании system_clock.

Обычно ли доступен high_resolution_clock в системах x64?
Как проверить, доступен ли high_resolution_clock для того, чтобы использовать #define для использования того или иного метода без генерации ошибки?

Jochen Arndt

"В моем компьютере микросекунды=0 при использовании system_clock."
?
В Windows разрешение часов по умолчанию составляет 15 мс. Самый низкий (лучший) - 0,5 мс.

"Обычно ли доступен high_resolution_clock в системах x64?
Как проверить, доступен ли high_resolution_clock для того, чтобы использовать #define для использования того или иного метода без генерации ошибки?"

http://en.cppreference.com/w/cpp/chrono/high_resolution_clock:
"Класс std:: chrono:: high_resolution_clock представляет часы с наименьшим периодом тика, предусмотренным реализацией. Это может быть псевдоним у std::хроно::system_clock или std::серии Chrono::steady_clock, или третьего, независимого часы."

Таким образом, он всегда присутствует, но может быть таким же, как и другие часы. Вы не можете проверить, что такое определение. Если вам нужно реальное разрешение, вы должны измерить его.

Javier Luis Lopez

Проблема заключается не только в разрешении, но и в том, чтобы избежать ошибки в мультиплатформенном sw, используя что-то вроде:
#ifndef _HIGH_RESOLUTION_CLOCK
#define CLOCK system_clock
#else
#define CLOCK high_resolution_clock
#endif

Jochen Arndt

Это не проблема при использовании компилятора C++11. Тогда high_resolution_clock присутствует (но может быть псевдонимом).
Если вы не используете компилятор C++11, system_clock и high_resolution_clock отсутствуют.