Daily bit(e) C++. std::chrono – измерение времени
Добавлено 15 августа 2026 в 05:42
Daily bit(e) C++ 73, измерение времени с помощью библиотеки std::chrono из C++11.

Библиотека std::chrono, добавленная в C++11, позволяет легко измерять время.
Данная библиотека предоставляет два типа для хранения информации о времени: временные точки и длительности. Представление временных точек определяется исходными часами. Длительности по умолчанию представляют собой целочисленные значения с фиксированной запятой (целая часть + дробная часть).
std::chrono поддерживает ожидаемые операции для манипуляций со временем, временные литералы (C++14), форматирование для iostream и std::format (C++20).
#include <chrono>
#include <thread> // sleep_for
#include <print>
using namespace std::literals;
auto tp1 = std::chrono::steady_clock::now(); // получить временную точку
std::this_thread::sleep_for(1ms); // литерал для миллисекунд
auto tp2 = std::chrono::steady_clock::now();
// базовый тип и точность зависят от типа часов
// decltype(tp2) == std::chrono::time_point<std::chrono::steady_clock>
/* Стандарт (до C++20) предлагает три варианта часов:
- std::chrono::system_clock
- std::chrono::steady_clock
- std::chrono::high_resolution_clock
*/
// Проверить стабильность работы часов и их точность можно так:
bool system_is_steady = std::chrono::system_clock::is_steady;
using resolution = std::chrono::system_clock::duration;
// resolution::period::num / resolution::period::den
auto duration = tp2 - tp1; // длительность это разница между временными точками
std::println("duration == {}\n", duration);
// пример вывода: 1115389ns
// явное указание типа длительности, базовый тип - double, с точностью до микросекунд
std::chrono::duration<double, std::micro> fpdur = tp2 - tp1;
std::println("fpdur == {}\n", fpdur);
// пример вывода: 1115.39us
// длительности можно преобразовывать между собой с помощью duration_cast
{
using namespace std::chrono;
auto milli = duration_cast<milliseconds>(tp2 - tp1);
std::println("milli == {}\n", milli);
// пример вывода: 1ms
}
// При работе с длительностями следует помнить, что
// они не представляют собой календарные даты
using day_t = std::chrono::duration<double, std::ratio<86400>>;
// дни, недели, месяцы, годы были добавлены в C++20
// продолжительность года - это средняя продолжительность года
day_t days_in_year = std::chrono::years{1};
// days_in_year == 365.2425
// месяц - это 1/12 года
day_t days_in_month = std::chrono::months{1};
// days_in_month == days_in_year / 12 == 30.436875
