Wpis z mikrobloga

Czy można, da się i powinno testować złożoność algorytmiczną? W sensie mam jakąś strukturę danych i nie chcę, by współpracownik zmienił ją przypadkiem z O(n log k) na np. O(n*k), ale nie miałbym nic przeciwko jeśli wpadłby na genialny pomysł i zrobił O(n + k).
Ktoś cokolwiek? A może testować bezpośrednio wydajność i czas wykonywania - tylko co jeśli np. na serwerze budującym ktoś odpali kilka innych tasków i będą konkurować o procesor?
#programowanie
  • 7
@Ginden: nie spotkałem się z takim testem w praktyce, ani z koniecznością takiego testu. Jeśli wydajność jest istotna to zwykle się testuje rzeczy od strony użytkownika. Np w grach czy nie gubi klatek, albo ja teraz w aktualnej firmie mam podane wymagania na czas przetworzenia 1 encji przez system.

Testuje się na kontrolowanym środowisku, i to jest oddzielone od testów jednostkowych, więc problemu podkradania procesora przez inne procesy nie ma. No
@Ginden:

fajny pomysl ale nie spotkalem sie z taka statyczna analiza ktora by byla w stanie stwierdzic zlozonosc algorytmu. raczej nalezaloby benchmarkowac ilosc wykonanych instrucji / stack framemow i ustawic gorny limit.
@taximan: Właśnie nie do końca mi chodzi o sprawdzenie złożoności, tylko o sprawdzenie czy złożoność jest nie większa niż pewna znana złożoność.
Np. czy zwiększenie rozmiarów wejścia 100 zwiększa czas wykonywania nie więcej niż np. 100 razy ±10%.
@Ginden: Hmm nie spotkałem się z takim testowaniem. W systemach biznesowych testy z reguły służą przetestowaniu logiki biznesowej, ale to pewnie wiesz :)

Pomysł poniekąd ciekawy ale taki test wymagałby sporego nakładu pracy. W przypadku prostych algorytmów byłoby to do ogarnięcia. W przypadku tych złożonych napisanie takiego testu byłoby zbyt czasochłonne. No chyba, że byłby to jakiś kluczowy algorytm to nakład pracy mógłby się zwrócić.
@Ginden: Jeśli potrzebujesz mieć określoną wydajność to przygotuj testy wydajnościowe.

Zmiana algorytmu na teoretycznie gorszy może przyspieszyć działanie systemu:
- optymalniejsze odwołania do pamięci
- mniejsza stała w złożoności
- algorytm może wykonać dodatkowy preprocessing danych, który przyspieszy wykonanie kodu w innym miejscu.

Możliwe są też przypadki, w których zwiększenie złożności minimalnie pogorszy wydajność, ale jednocześnie ułatwi przetestowanie, albo utrzymanie kodu.

Mając testy wydajnościowe wiesz, czy zmiana w kodzie miała realny