0Pricing
C++ Academy · Урок

Длительности и часы

Измеряйте интервалы времени

«Длительности и часы» — бесплатный урок 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, seconds
  • milliseconds, 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 — локальная установка не требуется.

Все уроки этого курса

  1. Длительности и часы
  2. Моменты времени
  3. Измерение производительности кода
  4. Календарь и часовые пояса
← Назад к C++ Academy