![]() |
![]() ![]() ![]() ![]() ![]() |
![]() |
Original TimersBoost , ,
|
Таймер домой CPU таймеры Оригинальные таймеры |
Эти таймеры обесценены.Они датируются самыми ранними днями Роста и не соответствуют текущей практике Роста.
|
Библиотека таймеров предоставляет два заголовка и три класса:
Заголовок Класс Функциональность timer.hpp таймер Время измерения истекло. progress.hpp progress_timer Измерение прошедшего времени (с использованием таймера), отображение на разрушении. progress.hpp progress_display Покажите признак прогресса в достижении известной цели.
Цель разработки этих классов была довольно ограниченной - они предназначены для простых целей, таких как время и отчетность о прогрессе для тестов программиста или пакетных рабочих потоков. Спецификации классов прогресса сформулированы в очень общих терминах, чтобы разрешить альтернативные реализации, такие как графические пользовательские интерфейсы.
Класс часов измеряет прошедшее время. Это, как правило, полезно для небольших временных задач. Предоставляемая им реализация обеспечивает умеренную портативность за счет зависимости от неизвестной точности и точности функции C Standard Library. Максимальное измеримое истекшее время может составлять 596,5 часов (или даже меньше) для реализации. Из-за этих ограничений этот таймер не может быть надежным и не должен использоваться, если это вызывает беспокойство.
#include <boost/timer.hpp> namespace boost { class timer { public: timer(); // postcondition: elapsed()==0 // compiler generated copy constructor, copy assignment, and dtor apply void restart(); // post: elapsed()==0 double elapsed() const; // return elapsed time in seconds double elapsed_max() const; // return estimated maximum value for elapsed() // Portability warning: elapsed_max() may return too high a value on systems // where std::clock_t overflows or resets at surprising values. double elapsed_min() const; // return minimum value for elapsed() }; // timer } // namespace boost
Конструкторы могут бросать<std::bad_alloc
>. Никакие другие функции не делают исключений.
Был очень разумный запрос от Эда Брея о методе определения максимального значения, которое может быть возвращено через elapsed(), но нет способа сделать это портативно. Проблема была поднята с группой, работающей над расширенной функциональностью времени для языка C. Решение может быть через годы в будущем. Между тем, elapsed_max() обеспечивает приближение.
Class progress_timer автоматически измеряет прошедшее время, а затем при разрушении отображает прошедшее сообщение времени в соответствующем месте в соответствующей форме. Поставляемая реализация по умолчанию отображает символ на std::cout.
Class progress_timer часто используется для выполнения программы. Его использование так же просто, как:
#include <boost/progress.hpp> int main() { progress_timer t; // start timing // do something ... return 0; }
Которые будут производить некоторые соответствующие результаты, например:
1.23 s
Обратите внимание, что "s" является официальной аббревиатурой System International d'Unités.
#include <boost/progress.hpp> namespace boost { class progress_timer : public timer, noncopyable { public: progress_timer(); progress_timer( std::ostream& os ); // os is hint; implementation may ignore ~progress_timer(); }; // progress_display } // namespace boost
Конструкторы могут бросать<std::bad_alloc
>. Никакие другие функции не делают исключений.
Дисплей Class progress_ отображает соответствующее указание на прогресс к заранее определенной цели в соответствующем месте в соответствующей форме. Это удовлетворяет потребность человека знать, развивается ли программа.
Например, если длительное вычисление должно быть выполнено на std::map<>с именем big_map, следующий код будет отображать индикатор прогресса:
progress_display show_progress( big_map.size() ); for ( big_map_t::iterator itr = big_map:begin(); itr != big_map.end(); ++itr ) { // do the computation ... ++show_progress; }
После обработки 70% элементов дисплей может выглядеть примерно так:
0% 10 20 30 40 50 60 70 80 90 100% |----|----|----|----|----|----|----|----|----|----| ************************************
#include <boost/progress.hpp> namespace boost { class progress_display : noncopyable { public: progress_display( unsigned long expected_count ); // Effects: restart(expected_count) progress_display( unsigned long expected_count, std::ostream& os, // os is hint; implementation may ignore const std::string & s1 = "\n", //leading strings const std::string & s2 = "", const std::string & s3 = "" ) // Effects: save copy of leading strings, restart(expected_count) void restart( unsigned long expected_count ); // Effects: display appropriate scale on three lines, // prefaced by stored copy of s1, s2, s3, respectively, from constructor // Postconditions: count()==0, expected_count()==expected_count unsigned long operator+=( unsigned long increment ) // Effects: Display appropriate progress tic if needed. // Postconditions: count()== original count() + increment // Returns: count(). unsigned long operator++() // Returns: operator+=( 1 ). unsigned long count() const // Returns: The internal count. unsigned long expected_count() const // Returns: The expected_count from the constructor. }; // progress_display } // namespace boost
Все функции-члены, кроме Count() и Expect_count(), выполняют выход, и поэтому теоретически могут выбрасывать исключения. На практике кажется, что исключение является маловероятным, и, вероятно, подразумевает такие серьезные проблемы, что исключение оправдано. Обратите внимание, что нет явного деструктора, поэтому бросание деструктора не является проблемой.
Эти классы произошли от более старых функций C++ и C, которые были полезны программистам в течение многих лет. Через список рассылки Boost Рид Свитман предложил отделить более полезный класс таймера от более целевых классов прогресса. Шон Корфилд предложил разрешить выход на любой ostream. Дэйв Абрахамс, Валентин Боннард, Эд Брей, Энди Глю и Дитмар Кюль также предоставили полезные комментарии. Эд Брей предложил таймер::elapsed_max(). Джон Мэддок предложил таймер::elapsed_min(). Toon Knapen предложил дополнительные ведущие строки, чтобы позволить маркировать дисплей прогресса
Ранние версии классов таймеров имели отдельные файлы реализации. Это создавало проблемы для пользователей, не желающих создавать библиотеки, создавало трудности с созданием DLL (из-за каскадного использования других библиотек, что, в свою очередь, приводило к недостаткам подсвеченных компиляторов) и приводило к тому, что классы не использовались даже тогда, когда это явно применимо. Таким образом, реализация была изменена на весь встроенный код.
Было несколько запросов на конкретные реализации платформы для использования предположительно высокопроизводительных таймеров из API операционной системы. Джон Мэддок представил реализацию с использованием Win32 API. Тесты показали, что, хотя точность этих таймеров была высокой, задержка иногда была намного выше, чем для функции std::clock(), и это очень плохо. Кроме того, результаты использования API Win32 были очень зависимы как от компилятора (испытывались Microsoft и Borland), так и от версии операционной системы (Windows NT, Windows 95 и т. д.) Таким образом, функция std::clock() была гораздо более надежной, и поэтому сохранялась даже на этой платформе с собственным API таймера.
Пересмотрено:04 Октябрь 201104 October 2011[ORIG_END] -->
© Copyright Beman Dawes 1999.
Распространяется в соответствии с Лицензией на программное обеспечение Boost, версия 1.0. См.www.boost.org/LICENSE_1_0.txt
Статья Original Timers раздела может быть полезна для разработчиков на c++ и boost.
Материалы статей собраны из открытых источников, владелец сайта не претендует на авторство. Там где авторство установить не удалось, материал подаётся без имени автора. В случае если Вы считаете, что Ваши права нарушены, пожалуйста, свяжитесь с владельцем сайта.
:: Главная :: ::
реклама |