Narzędzia użytkownika

Narzędzia witryny


timer

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

timer.txt · ostatnio zmienione: 2009/04/26 22:43 przez lucas