Testy testów

Dobrze, ale za wolno

Testy funkcjonalne to tylko jedna strona medalu. Poprawny kod nie zawsze jest wystarczająco wydajny. W 1975 r. Michael Jackson w książce Principles of Program Design sformułował dwie zasady dotyczące optymalizacji. Pierwsza reguła optymalizacji brzmi: "Nie rób tego". Druga, adresowana tylko do ekspertów, nakazuje: "Nie rób tego teraz".

W przypadku większości aplikacji optymalizacja ręczna powinna polegać nie tyle na wyborze optymalnych struktur językowych czy nienagannym zapisie kodu, lecz także na doborze algorytmów. Pierwszym krokiem w optymalizacji jest analiza, które fragmenty aplikacji pochłaniają najwięcej zasobów, a ich wykonanie zabiera najwięcej czasu. Niemal każde komercyjne środowisko IDE jest wyposażone w profiler, który gromadzi dane o wykonywanym kodzie, wskazuje najwolniej działające funkcje, analizuje zużycie pamięci.

Współczesne środowiska dla programistów eliminują tzw. przecieki pamięci. Innymi słowy zwalniają programistę z obowiązku kontrolowania, czy zwalniana jest zaalokowana pamięć. W niektórych językach (zwłaszcza C/C++) są dostępne specjalne biblioteki, czy to eliminujące występowanie przecieków, czy też dostarczające framework do zarządzania pamięcią. Nie ma jednak systemu, który by wspomagał optymalne wykorzystanie pamięci. Nawet najbardziej inteligentny "odśmiecacz" nie będzie mógł zwolnić pamięci, gdy program został źle napisany.

Chyba najbardziej kompleksowe rozwiązania do profilowania aplikacji oferuje Compuware. Różne edycje DevPartner mogą sprawdzać kod Win32 (C/C++), .Net i kod w Javie. Dostępna jest także edycja dla 64-bitowego Itanium. Narzędzie BundChecker jest przeznaczone do dokładnej analizy wykorzystania pamięci w projektach w Visual C++.

Warto dodać, że w przypadku Javy i .Net wirtualne środowisko jest wyposażone w mechanizmy do analizowania m.in. wydajności i zużycia pamięci. Wiele projektów open source wykorzystuje te możliwości do tworzenia wyspecjalizowanych pakietów, które np. mogą monitorować sposób działania "odśmiecacza" czy stworzyć graf alokacji i zwolnień pamięci połączony z poszczególnymi funkcjami i klasami (przykładem takiego produktu dla Javy jest JMP lub Allocation Profiler dla .Net).

Z poziomu procesora

W przypadku gdy jednak trzeba optymalizować kod "niskopoziomowo", mogą być pomocne narzędzia producentów procesorów.

Intel VTune Performance Analyzer jest narzędziem przeznaczonym do szczegółowej analizy kodu aplikacji dla procesorów Intela - obecnie jest dostępna wersja dla Windows i Linuxa. Badane jest zużycie poszczególnych zasobów procesora, np. czy są optymalnie wykorzystane mechanizmy równoległego wykonywania instrukcji. Podobny pakiet opracowała i udostępnia bezpłatnie także AMD. Narzędzie AMD CodeAnalyst może symulować wykonanie programu z dokładnością do 1 ms.

Na bieżąco można podglądać zawartość poszczególnych potoków przetwarzania, a także określać, jakie statystyki mają być zliczane.

CodeAnalyst obsługuje oczywiście instrukcje 3DNow!

Pięć przykazań programisty
  1. Nigdy nie zakładaj, że napisany kod działa poprawnie

  2. Pisząc kawałek kodu, od razu zastanów się, jak go testować

  3. Nie pokładaj zbytniej ufności w narzędziach - one tylko wspomagają pracę testera. To człowiek musi opracować sposób testowania

  4. Używaj jasnych i przejrzystych struktur w danym języku programowania - optymalizację zostaw kompilatorowi

  5. Wydajność zależy głównie od algorytmu, a nie od sposobu zakodowania

TOP 200