====== Biblioteka Boost::Timer ======
**Łukasz Dobrodziej T-TIZ**
===== Wstęp =====
Biblioteka Timer zapewnia trzy klasy, które umożliwiają kontrolę czasu - klasę ''timer'' do mierzenia czasu, który upłynął od danej chwili, klasę ''progress_timer'' do raportowania czasu oraz klasę ''progress_display'' do wyświetlania wskaźnika postępu. Klasy są wyposażone w obsługę wyjątków np. konstruktory mogą rzucić ''std::bad_alloc''. W praktyce rzucanie wyjątków przez obiekty tych klas jest mało prawdopodobne.
===== Klasa timer =====
Umożliwia mierzenie czasu. Jej implementacja oferuje umiarkowaną przenośność zależną od nieznanej dokładności i precyzji funkcji clock() z biblioteki standardowej języka C. Maksymalny czas jaki pozwala zmierzyć wynosi nie więcej niż 596.5 godzin. Ze względu na te ograniczenia klasa timer nie jest uznana za silną i nie powinna być używana w programach, w których jej ograniczenia mogłoby się okazać krytyczne.
Klasa udostępnia cztery metody:
* **''elapsed()''** zwraca czas w sekundach, który upłynął od chwili utworzenia obiektu klasy timer bądź jego zrestartowania.
* **''restart()''** zeruje timer.
* **''elapsed_min()''** zwraca minimalną wartość jaką może wskazać funkcja elapsed().
* **''elapsed_max()''** zwraca oszacowaną wartość maksymalną dla funkcji elapsed(), wartość ta może być przekłamana na niektórych platformach z powodu problemów z std::clock_t.
Przykład użycia:
boost::timer t; // uruchomienie zegara (rozpoczecie odmierzania czasu)
for (int i=0; i<10000000; ++i) std::rand();
std::cout << t.elapsed() << std::endl; //wyswietlenie aktualnej wartosci zegara
===== Klasa progress_timer =====
Automatycznie mierzy upływający czas a następnie w czasie destrukcji wyświetla informacje o zmierzonym czasie w odpowiednim miejscu i formie. W implementacji jako miejsce wyświetlania domyślnie ustawiony jest strumień std::cout. Klasa progress_time jest najczęściej używana do mierzenia czasu wykonania programu.
Przykład użycia:
int main()
{
progress_timer t; // uruchomienie zegara
// cos się wykonuje ...
return 0; //program się konczy, na standardowym wyjsciu wyswietlany jest czas wykonania programu w nastepujacej formie ”1.45 s”
}
===== Klasa progress_display =====
Wyświetla wskaźnik postępu do zdefiniowanego celu w odpowiedniej formie i miejscu. Pozwala to na powiadomienie użytkownika, że program działa i w jakim jest stanie. Klasa może być wykorzystana, gdy na przykład chcemy wykonać skomplikowane obliczenia na dużym kontenerze danych. Klasa udostępnia następujące metody:
* **''count()''** zwraca wartość wewnętrznego licznika.
* **''expected_count()''** zwraca wartość docelową, podaną podczas kontrukcji obiektu.
* **''restart(unsigned long expected_count)''** ustawia nową wartość docelową, zeruje licznik.
Klasa ma przeładowane operatory ''++'' i ''+='', które służą do zwiększania licznika (i jeżeli to konieczne dorysowania odpowiedniego znaku postępu). Dodatkowo przy pomocy konstruktora możemy zmienić miejsce wyświetlania paska postępu operacji oraz możemy dodać tytuł dla każdego wiersza. Deklaracja konstruktora ma następującą postać:
progress_display( unsigned long expected_count,
std::ostream& os, // os jest sugestia, moze byc zignorowany
const std::string & s1 = "\n",
const std::string & s2 = "",
const std::string & s3 = "" )
Przykład użycia:
progress_display show_progress( big_map.size() ); //inicjalizacja obiektu, zdefiniowanie wartosci docelowej
for ( big_map_t::iterator itr = big_map:begin();
itr != big_map.end(); ++itr )
{
// wykonywanie jakichs obliczen
++show_progress; //wyswietlanie postepu na standardowym wyjsciu
}
Gdy np. 70% elementów kontenera zostanie przeliczonych zobaczymy następujący obrazek:
0% 10 20 30 40 50 60 70 80 90 100%
|----|----|----|----|----|----|----|----|----|----|
************************************
===== Kod z przykładowym wykorzystaniem =====
Do analizowania przykładowego kodu należy przejść po zapoznaniu się z wyżej wymienionymi informacjami o bibliotece boost::timer.
{{timer_test.cpp}}