Daily bit(e) C++. std::chrono – измерение времени

Добавлено 15 августа 2026 в 05:42

Daily bit(e) C++ 73, измерение времени с помощью библиотеки std::chrono из C++11.

Daily bit(e) C++

Библиотека 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

Пример на Compiler Explorer

Теги

C++ / CppchronoDaily bit(e) C++Программирование