• Nie Znaleziono Wyników

Dodatek A - Pomiar niezależności czasu realizacji bloku programu

9.1. Metody pomiaru szybkości wykonywania programu

Umieszczenie procedur pomiarowych w programie

Najprostszym sposobem pomiaru czasu wykonania poszczególnych fragmentów programu jest umieszczenie procedur pomiarowych w treści programu. Procedury te mają za zadanie uzyskać i zapamiętać wartość czasu na początku i na końcu mierzonego fragmentu kodu. Metoda ta ze względu na wnoszone błędy dobrze sprawdza się jedynie przy pomiarze długich odcinków czasu (np. całego programu). Przy pomiarze czasu wykonania małych fragmentów kodu otrzymywane są błędne wyniki ze względu na:

• zmianę treści programu przez procedury pomiarowe – konieczność wykonania dodatkowych czynności, • zmianę długości programu i jego rozmieszczenia w pamięci, mogącą mieć wpływ na zarządzanie pamięcią

przez system operacyjny,

• wywoływanie dodatkowych funkcji systemowych, zajmujące dużo czasu i wymagające przełączenia procesora w tryb uprzywilejowany,

• zmianę zawartości pamięci podręcznych, • rozsynchronizowanie procesów współbieżnych,

• rozsynchronizowanie szybkości procesów i urządzeń we/wy.

Umieszczenie procedur pomiarowych w systemie operacyjnym

Możliwe jest umieszczenie funkcji pomiarowych wewnątrz systemu operacyjnego. Może on zapisywać czas każdego wywołania funkcji systemowej, co daje obraz postępu prac badanego programu. Dodatkowo może on zapamiętywać adres przerwanej instrukcji podczas każdego przerwania zegarowego. Opisana metoda w mniejszym stopniu zakłóca mierzony obiekt ponieważ:

• nie generuje dodatkowych wywołań funkcji systemowych ani przerwań. • nie zmienia treści ani długości programu.

• wyniki pomiarów zapisywane są w innym obszarze pamięci niż dane programu.

Modyfikacja systemu operacyjnego jest zdecydowanie trudniejsza od wprowadzenia procedur pomiarowych do programu. Wymaga bardzo dobrej znajomości systemu, posiadania uprawnień i narzędzi do jego modyfikacji oraz liczenia się z koniecznością restartów maszyny i przeinstalowywania oprogramowania.

Rozbudowa sprzętu o możliwości pomiarowe

Pomiaru szybkości wykonywania programu można dokonywać za pomocą specjalnie do tego przezna-czonych modułów sprzętowych. Mają one za zadanie zaobserwować moment występowania charakterystycz-nych fragmentów programu i zapamiętać czas ich wystąpienia. Wynika z tego konieczność posiadania przez moduł pomiarowy własnej pamięci (żeby nie zakłócać pracy mierzonego programu dostępem do pamięci). Dużym problemem jest wychwycenie przez moduł faktu dojścia badanego programu do charakterystycznego punktu. Karty rozszerzeń podłączane poprzez szyny ISA lub PCI są w stanie obserwować jedynie aktywność

umieścić pomiędzy nimi specjalne instrukcje we/wy (co jest modyfikacją programu wpływającą na jego szybkość). Produkuje się moduły pomiarowe nadzorujące bezpośrednio komputery jednoukładowe, jednak skonstruowanie układu rejestrującego pracę współczesnych, szybkich procesorów wiąże się z bardzo dużym nakładem kosztów.

Użycie maszyny wirtualnej

W celu określenia szybkości wykonywania niewielkich fragmentów programu można posłużyć się maszyną wirtualną emulującą działanie rzeczywistego systemu. Wymagana jest przy tym bardzo wierna symulacja, uwzględniające wszystkie aspekty mające wpływ na czas realizacji instrukcji. Użycie maszyny wirtualnej ma następujące zalety:

• możliwość określenia czasu realizacji programu dla systemu niedostępnego na rynku,

• możliwość wykorzystania projektu procesora (systemu) jako podstawy do konstrukcji maszyny wirtualnej, Wadami takiego rozwiązania są:

• mała szybkość maszyny wirtualnej – konieczność długiego oczekiwania na wyniki,

• mała wierność symulacji maszyn wirtualnych optymalizowanych pod kątem szybkości symulacji.

Wybrana metoda pomiaru

Pomiaru czasu wykonania badanej procedury dokonano przez obliczenie różnicy czasu jej początku i końca. Jako źródło aktualnego czasu wykorzystano funkcję gettimeofday, wchodzącą w skład podstawowych funkcji UNIXa. Przeprowadzając pomiary przy użyciu komputerów wyposażonych w procesor typu Pentium wykorzystano licznik cykli maszynowych umożliwiający uzyskanie największej możliwej rozdzielczości pomiaru, jak również uniknięcie wywołania funkcji systemowej.

Ponieważ procedura pomiarowa sama w sobie stanowi fragment programu, zatem wynikiem pomiaru jest suma czasów realizacji badanego programu i procedury pomiarowej. Dodatkowy narzut czasowy związany z dokonywaniem pomiarów musi zostać uwzględniony podczas opracowywania wyników analizy i porównania ich z przewidywaniami teoretycznymi.

Aby określić rozkład losowy czasu realizacji danej procedury przeprowadzono wielokrotny pomiar w ramach jednego uruchomienia programu testowego. Wyniki pomiarów były zapisywane do tablicy. Po zakończeniu wszystkich pomiarów następowało formatowanie wyników i zapis na dysk. Wymuszono również wpisanie całej tablicy do pamięci podręcznej przed rozpoczęciem pomiarów. Udało się dzięki temu zmniejszyć błąd wprowadzany przez same procedury pomiarowe.

9.2. Zależność czasu realizacji od historii procesu

W celu określenia wpływu uprzednio wykonanych czynności na czas realizacji bloku programu wykonano po 4000 pomiarów czasu realizacji bloku. Wybrano trzy rodzaje bloków testowych:

• Blok zawierający obliczenia na rejestrach (obliczanie ciągu an=an-1+an-2) • Blok przetwarzający obszar pamięci (sortowanie)

• Blok przeglądający obszar pamięci (duży)

Na początku pomiaru wykonywana jest procedura usuwania kodu i danych badanego programu z pamięci podręcznej. Ze względu na kompatybilność i ograniczenia uprawnień nie użyto rozkazów sterujących pamięcią, lecz wykonano procedurę, która posiadając długi kod oraz operując na dużej ilości danych wypełniła cache

„swoimi” wartościami. Następnym krokiem jest wykonanie bloku tworzącego historię procesu. Wybrano fragmenty o następującej charakterystyce:

• Pusty blok

• Blok obliczania wyznacznika i drukowania wyników • Blok taki sam jak następny (mierzony)

Pomiarów dokonano przy użycia komputera z procesorem Intel-Pentium pracującego pod kontrolą systemu Linux. Podsumowanie wyników (w µsec) przedstawiono w tabeli 10-1. Kolejne kolumny zawierają czasy dla trzech bloków poprzedzających. Kolejne wiersze reprezentują fragmenty następujące w drugiej kolejności, których czas jest mierzony. Dla każdego cyklu pomiarów obliczono wartość średnią oraz odchylenie standardowe.

Tabela 9-1 Zależność czasu realizacji bloku od rodzaju bloku go poprzedzającego

brak wyznacznik ten sam kod

średnia odch. std. średnia odch. std. Średnia odch. std.

ciąg 5380 392 5346 418 5288 215

sortowanie 5893 815 5913 780 5882 419

przegląd 7483 593 7531 654 6676 354

Weryfikacja hipotezy H0 o niezależności wartości średniej rozkładu losowego czasu realizacji bloku od rodzaju bloku go poprzedzającego, przeciwko hipotezie alternatywnej, że wartość średnia jest zależna:

Na podstawie nierówności Czebyszewa określono przedziały ufności wartości średniej na poziomie 95%. Nie czyniono żadnych założeń co do kształtu rozkładu losowego.

( )

2 2 1 ε σ ε ε n X X X p − < śr< + ≥ − (9-1)

Jeżeli przedziały ufności mają część wspólną to nie ma podstaw do odrzucenia hipotezy o równości średnich, w przeciwnym przypadku należy hipotezę odrzucić.

Tabela 9-2 Przedziały ufności 95% dla wartości średniej

brak wyznacznik ten sam kod

min max min max Min Max

Ciąg 5352 5408 5316 5376 5273 5303

Sortowanie 5835 5951 5858 5968 5852 5912

Przegląd 7441 7525 7485 7577 6651 6701

Wniosek 1:

Przedziały w trzecim wierszu tabeli 10-2 są rozłączne, zatem z prawdopodobieństwem co najmniej 95% można stwierdzić, że rozkłady mają różne wartości średnie, a zatem są różne.

Wniosek 2:

Przedziały w kolumnie „brak” i „wyznacznik” mają dużą część wspólną, zatem nie ma podstaw do odrzucenia hipotezy o zgodności rozkładów. Co więcej istnieje duże prawdopodobieństwo, że wartości średnie (rzeczywiste, a nie z próby) różnią w niewielkim stopniu. Ma to szczególne znaczenie wobec faktu, że przedziały ufności oszacowane przy braku informacji na temat kształtu rozkładu losowego są szersze niż dla rozkładów o kształtach normalno-podobnych [Gaj96].

Test serii Walda-Wolfowitza:

W celu stwierdzenia zgodności rozkładów o nieznanych kształtach przeprowadzono test Walda-Wolfowitza porównując parami rozkłady z każdego wiersza tabeli 10-2. Literatura [Gaj96] zaleca ten typ testu zamiast zmodyfikowanych wersji testu Chi-kwadrat do badania czy dwie próby pobrane są z tej samej populacji. Wyższość testów nieparametrycznych jest szczególnie wyraźna dla dużej liczby próbek zawierających sporadycznie bardzo duże wartości (badania kształtu rozkładu opisano w rozdziale 7).

Testujemy hipotezę H0 o równości rozkładów przeciw hipotezie, że są one różne. Wald i Wolfowitz wykazali że dla liczby pomiarów m, n pochodzących z dwóch badanych rozkładów dążącej do nieskończoności liczba serii R ma rozkład normalny.