Длительности и часы
Измеряйте интервалы времени
«Длительности и часы» — бесплатный урок C++ Academy на CoddyKit. Это урок 1 из 4. Ты можешь прочитать весь урок бесплатно ниже — а потом практиковать его прямо в браузере с встроенным редактором кода и ИИ-репетитором 24/7. Это часть пути обучения C++ Academy, и твой прогресс синхронизируется между веб-версией и приложением CoddyKit. Курс C++ Academy содержит 4 уроков всего.
Зачем нужен <chrono>?
Библиотека <chrono> предоставляет C++ типобезопасный способ работы со временем. Вместо необработанных целых чисел Вы используете строго типизированные интервалы времени и временные точки, поэтому компилятор выявляет ошибки в единицах измерения.
- Больше не нужно путать секунды и миллисекунды.
- Единицы измерения являются частью системы типов.
#include <iostream>
#include <chrono>
int main() {
using namespace std::chrono;
seconds s{5};
std::cout << "Duration: " << s.count() << " seconds\n";
return 0;
}Что такое интервал времени
std::chrono::duration представляет промежуток времени. Он хранит количество тактов и соотношение, описывающее период такта. Предопределённые псевдонимы охватывают распространённые единицы измерения.
hours,minutes,secondsmilliseconds,microseconds,nanoseconds
#include <iostream>
#include <chrono>
int main() {
using namespace std::chrono;
milliseconds ms{1500};
std::cout << ms.count() << " ms\n";
return 0;
}Литералы интервалов времени
Пространство имён std::chrono_literals позволяет записывать интервалы времени с суффиксами вроде 5s или 200ms, благодаря чему код читается почти как обычный текст.
#include <iostream>
#include <chrono>
int main() {
using namespace std::chrono_literals;
auto wait = 3s;
auto blink = 250ms;
std::cout << wait.count() << "s, " << blink.count() << "ms\n";
return 0;
}Преобразование интервалов времени
duration_cast преобразует единицы измерения. Преобразование из более мелкой единицы в более крупную усекает значение, поэтому 1500 мс превращаются в 1 с.
#include <iostream>
#include <chrono>
int main() {
using namespace std::chrono;
milliseconds ms{1500};
seconds s = duration_cast<seconds>(ms);
std::cout << s.count() << " whole seconds\n";
return 0;
}Арифметика над интервалами времени
Интервалы времени поддерживают операции +, -, * и /. При смешивании единиц измерения автоматически выбирается более мелкая общая единица.
#include <iostream>
#include <chrono>
int main() {
using namespace std::chrono;
auto total = minutes{2} + seconds{30};
std::cout << total.count() << " seconds total\n";
return 0;
}Интервалы времени с плавающей точкой
При преобразовании можно использовать представление с плавающей точкой, чтобы сохранить дробные значения и избежать усечения, характерного для целочисленных интервалов.
#include <iostream>
#include <chrono>
int main() {
using namespace std::chrono;
milliseconds ms{1500};
duration<double> secs = ms;
std::cout << secs.count() << " seconds\n";
return 0;
}Что такое часы
Часы предоставляют текущее время. Стандартная библиотека предлагает три варианта:
system_clock— календарное времяsteady_clock— никогда не движутся назад, идеально подходят для измерений времениhigh_resolution_clock— обеспечивают наиболее мелкий доступный шаг
#include <iostream>
#include <chrono>
int main() {
using namespace std::chrono;
auto now = steady_clock::now();
std::cout << "Got a time point: " << (now.time_since_epoch().count() > 0) << '\n';
return 0;
}system_clock
system_clock отслеживает календарное время реального мира и может быть преобразован в time_t для отображения. Он может резко изменить значение, если системные часы настроить.
#include <iostream>
#include <chrono>
int main() {
using namespace std::chrono;
auto tp = system_clock::now();
auto secs = duration_cast<seconds>(tp.time_since_epoch());
std::cout << "Seconds since epoch is positive: " << (secs.count() > 0) << '\n';
return 0;
}steady_clock
steady_clock является монотонным: он движется только вперёд с постоянной скоростью. Используйте его всегда, когда измеряете прошедшее время, и никогда не используйте system_clock.
#include <iostream>
#include <chrono>
int main() {
using namespace std::chrono;
auto a = steady_clock::now();
auto b = steady_clock::now();
std::cout << "Monotonic: " << std::boolalpha << (b >= a) << '\n';
return 0;
}Точность часов
Каждые часы предоставляют свой period в виде соотношения, известного во время компиляции. Во время компиляции также можно проверить, являются ли часы монотонными.
#include <iostream>
#include <chrono>
int main() {
using namespace std::chrono;
std::cout << "steady_clock is_steady: " << std::boolalpha << steady_clock::is_steady << '\n';
std::cout << "system_clock is_steady: " << system_clock::is_steady << '\n';
return 0;
}Объединяем всё
Объединяйте часы и интервалы времени: считайте две временные точки и вычисляйте разницу как интервал времени в выбранной единице.
#include <iostream>
#include <chrono>
int main() {
using namespace std::chrono;
auto start = steady_clock::now();
long sum = 0;
for (int i = 0; i < 1000000; ++i) sum += i;
auto end = steady_clock::now();
auto us = duration_cast<microseconds>(end - start);
std::cout << "Loop took at least 0 us: " << (us.count() >= 0) << '\n';
return 0;
}Быстрая проверка
Проверьте понимание того, какие часы следует использовать для измерения времени.
Итоги
Вы узнали, что <chrono> предоставляет:
- интервалы времени — типобезопасные промежутки времени с литералами вроде
5s duration_castдля преобразования единиц измерения (целые значения усекаются)- часы —
system_clock,steady_clock,high_resolution_clock - используйте
steady_clockдля измерения интервалов
Далее Вы научитесь представлять конкретные моменты времени с помощью временных точек.
Часто задаваемые вопросы
Урок «Длительности и часы» бесплатный?
Да — полный текст урока «Длительности и часы» бесплатно доступен здесь в веб-версии. Чтобы практиковать его интерактивно (встроенный редактор кода и ИИ-репетитор 24/7) и разблокировать остальной курс C++ Academy, подпишись на CoddyKit PRO. Курс C++ Academy содержит 4 уроков всего.
Чему я научусь в уроке «Длительности и часы»?
Измеряйте интервалы времени Ты практикуешь C++ Academy с помощью реального кода, который запускаешь прямо в браузере, и ИИ-репетитор 24/7 отвечает на твои вопросы во время урока.
Нужен ли мне опыт, чтобы начать C++ Academy?
Предыдущий опыт не требуется. C++ Academy на CoddyKit структурирован для всех уровней — от новичков до продвинутых, поэтому ты можешь начать отсюда или с самого начала и учиться в своем темпе. Это урок 1 из 4.
Сколько времени занимает урок «Длительности и часы»?
Большинство уроков CoddyKit занимают около 5–10 минут. Каждый из них компактный и интерактивный, поэтому ты постоянно делаешь прогресс и продолжаешь с того же места в веб-версии и приложении.
Можно ли писать и запускать код в этом уроке C++ Academy?
Да. Каждый урок C++ Academy включает встроенный редактор кода, поэтому ты пишешь и запускаешь реальный код прямо в браузере и получаешь моментальную обратную связь от AI — локальная установка не требуется.
Все уроки этого курса
- Длительности и часы
- Моменты времени
- Измерение производительности кода
- Календарь и часовые пояса