Главная страница Случайная страница КАТЕГОРИИ: АвтомобилиАстрономияБиологияГеографияДом и садДругие языкиДругоеИнформатикаИсторияКультураЛитератураЛогикаМатематикаМедицинаМеталлургияМеханикаОбразованиеОхрана трудаПедагогикаПолитикаПравоПсихологияРелигияРиторикаСоциологияСпортСтроительствоТехнологияТуризмФизикаФилософияФинансыХимияЧерчениеЭкологияЭкономикаЭлектроника |
Работа со временем
Нам часто приходится иметь дело со временем или выполнять некоторые операции, в зависимости от времени. Например, примитивы синхронизации из стандартной библиотеки – мьютексы и блокировки, предоставляют возможность потоку ожидать некоторый период времени (duration) или ожидать достижения определенного времени (time_point). Для получения текущего времени (в виде time_point) можно вызвать метод now() для одних из трех часов (clocks): system_clock, monotonic_clock, high_resolution_clock. Например: monotonic_clock:: time_point t = monotonic_clock:: now(); // некоторые операции monotonic_clock:: duration d = monotonic_clock:: now() - t; // операция заняла d времени
clock возвращает time_point, а duration – это разница двух экземпляров time_point для одного и того же объекта clock. И, как обычно, для простоты вы можете воспользоваться ключевым словом auto: auto t = monotonic_clock:: now(); // некоторые операции auto d = monotonic_clock:: now() - t; // операция заняла d времени
Утилиты по работе со временем предназначены для эффективной реализации низкоуровневых возможностей; они не предоставляют удобных возможностей для работы с вашим социальным календарем. На самом деле, эти возможности разрабатывались с учетом потребностей физики высоких энергий. Чтобы иметь возможность выразить время в любых градациях (будь то век или пикосекунда), избежать неоднозначностей в единицах измерения, а так же ошибок при округлении, типы duration и time_point используют пакет работы с рациональными числами времени компиляции. Тип duration состоит из двух частей: количества «тиков» и «периода», который характеризует длительность одного тика (соответствует ли он секунде или миллисекунде?); период (period) является частью типа duration. Следующая таблица, взята из заголовочного файла стандартной библиотеки < ration>; она определяет периоды в системе СИ и может дать понятия об области применения: // синонимы для периодов в системе СИ: typedef ratio< 1, 1000000000000000000000000> yocto; // частичная поддержка typedef ratio< 1, 1000000000000000000000> zepto; // частичная поддержка typedef ratio< 1, 1000000000000000000> atto; typedef ratio< 1, 1000000000000000> femto; typedef ratio< 1, 1000000000000> pico; typedef ratio< 1, 1000000000> nano; typedef ratio< 1, 1000000> micro; typedef ratio< 1, 1000> milli; typedef ratio< 1, 100> centi; typedef ratio< 1, 10> deci; typedef ratio< 10, 1> deca; typedef ratio< 100, 1> hecto; typedef ratio< 1000, 1> kilo; typedef ratio< 1000000, 1> mega; typedef ratio< 1000000000, 1> giga; typedef ratio< 1000000000000, 1> tera; typedef ratio< 1000000000000000, 1> peta; typedef ratio< 1000000000000000000, 1> exa; typedef ratio< 1000000000000000000000, 1> zetta; // частичная поддержка typedef ratio< 1000000000000000000000000, 1> yotta; // частичная поддержка
Рациональные числа времени компиляции (compile time rational numbers) предоставляют обычные арифметические операции (+, -, * и /), и операции сравнения (==,! =. <, < =, >, > =) для всех разумных комбинаций типов duration и time_point (например, вы не можете сложить два экземпляра time_point). В этих операциях также выполняется проверка переполнения и деления на ноль. Вам не стоит задумываться о производительности, поскольку это возможности времени компиляции. Кроме того, для типов duration, вы можете использовать операции ++, --, -=, *= и /=, а также операции tp += d, tp -= d для time_point tp и duration d. Вот несколько примеров использования стандартных типов duration, определенных в < chrono>: microseconds mms = 12345; milliseconds ms = 123; seconds s = 10; minutes m = 30; hours h = 34; // явно указываем пространство имен auto x = std:: chrono:: hours(3); // предполагаем наличие необходимых директив " using" auto x = hours(2)+minutes(35)+seconds(9);
Вы не можете инициализировать duration дробным значением. Например, не пытайтесь создать период, равный 2.5 секунды, используйте вместо этого 2500 миллисекунд. Связано это с тем, что период реализован в виде некоторого количества «тиков». Каждый тик представляет собой набор «периодов», таких как milli или kilo. В качестве периода по умолчанию используются секунды; т.е. интервал с периодом, равным 1, «тик» будет равен одной секунде. Мы можем явно указать единицы измерения для duration: // секунды (значение по умолчанию) duration< long> d0 = 5; // килосекунды! duration< long, kilo> d1 = 99; // d1 и d2 одинакового типа (" kilo" означает " *1000") duration< long, ratio< 1000, 1> > d2 = 100;
Если мы захотим сделать что-то с duration, например, распечатать, то мы должны задать единицу измерения, minutes или microseconds. Например: auto t = monotonic_clock:: now(); // некоторые операции auto d = monotonic_clock:: now() - t; cout < < " something took " < < duration< double> (d).count() < < " seconds\n";
Метод count() возвращает количество «тиков». См. также:
|