Студопедия

Главная страница Случайная страница

Разделы сайта

АвтомобилиАстрономияБиологияГеографияДом и садДругие языкиДругоеИнформатикаИсторияКультураЛитератураЛогикаМатематикаМедицинаМеталлургияМеханикаОбразованиеОхрана трудаПедагогикаПолитикаПравоПсихологияРелигияРиторикаСоциологияСпортСтроительствоТехнологияТуризмФизикаФилософияФинансыХимияЧерчениеЭкологияЭкономикаЭлектроника






Работа со временем






Нам часто приходится иметь дело со временем или выполнять некоторые операции, в зависимости от времени. Например, примитивы синхронизации из стандартной библиотеки – мьютексы и блокировки, предоставляют возможность потоку ожидать некоторый период времени (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() возвращает количество «тиков».

См. также:

  • Standard: 20.9 Time utilities [time]
  • Howard E. Hinnant, Walter E. Brown, Jeff Garland, and Marc Paterno: A Foundation to Sleep On. N2661=08-0171. Including ``A Brief History of Time'' (With apologies to Stephen Hawking).

 






© 2023 :: MyLektsii.ru :: Мои Лекции
Все материалы представленные на сайте исключительно с целью ознакомления читателями и не преследуют коммерческих целей или нарушение авторских прав.
Копирование текстов разрешено только с указанием индексируемой ссылки на источник.