Derekursywacja_i_optymalizacja_kodu

Download Report

Transcript Derekursywacja_i_optymalizacja_kodu

DEREKURSYWACJA I
OPTYMALIZACJA KODU
Adam Kościelniak IiE III: Ekonometria
Derekursywacja
Derekursywacja
przemiana
algorytmów
rekurencyjnych (rekursyjnych) na iteracyjne. Stosuje
się ją w celu zwiększenia szybkości działania
aplikacji
(korzystającej
z
algorytmów
rekurencyjnych) oraz zmniejszenia jej zajętości
pamięciowej.
Iteracja
Iteracja (łac. iteratio ‘powtórzenie’) to czynność
powtarzania (najczęściej wielokrotnego) tej samej
instrukcji (albo wielu instrukcji) w pętli. Mianem
iteracji określa się także operacje wykonywane
wewnątrz takiej pętli.
Rekurencja
Rekurencja albo rekursja (ang. recursion, z łac.
recurrere, przybiec z powrotem) to w logice,
programowaniu i w matematyce odwoływanie się
np. funkcji lub definicji do samej siebie.
Porównajmy
Iteracyjnie
Rekurencyjnie
Mierzenie czasu wykonania
Po modyfikacji kodu możemy mierzyć efektywność
algorytmu dla różnej liczby wykonań :
Wyniki dla silni
Rekurencja
Iteracja
10000: 0.00300 sekund
100000: 0.03300 sekund
1000000: 0.36600 sekund
10000: 0.00100 sekund
100000: 0.01600 sekund
1000000: 0.14500 sekund
Optymalizacja kodu
Preferuj inicjalizację na przypisanie
Weźmy pod uwagę przykład:
W ten sposób oszczędzamy kompilatorowi pracy
ponieważ nie musi się on po raz kolejny odwoływać do
costructora typu complex (zdefiniowany wcześniej w
programie typ – liczba zespolona)
Rozmiar struktur
Staraj się tworzyć struktury których rozmiar jest
potęgą dwójki.
00000001
1
00000010
2
00000100
4
00001000
8
00010000
16
Zakres Case’ów
Staraj się utrzymywać Case w wąskim zakresie
1
Zrób 1
2
Zrób 2
3
Zrób 3
4
Zrób 4
def
Zrób 5
Rozbijanie dużych switchy
Duże switche możemy rozbijać
na ciągi switchy
zagnieżdżonych (nested).
Znacznie zmieniejsza to ilość
wykonanych porównań.
Jak najmniej zmiennych lokalnych
Jeśli utrzymamy liczbę zmiennych lokalnych kompilator
przetrzyma je wszystkie w rejestrach.
Zredukuj ilość parametrów
Jeśli funkcja używa dużej ilości parametrów każde
wywołanie będzie wymagało operacji na stosach. Z
tego samego powodu należy unikać przekazywania
całych struktur jako parametry, używaj wskaźników
i referencji.
Struktura
Funkcja
*Wskaźnik
Idąc dalej…
Najlepiej ogólnie obiektów większych niż 4 bajty nie
powinno się kopiować do funkcji a używac
wskaźnika
8
Funkcja
Preferuj int nad char i short
Kiedy to tylko możliwe preferuj integer and char
Pobierz
wartości
zmiennych
Konwertuj
na
integer
Wykonaj
działanie
Wykonaj działanie
Pobierz wartości
zmiennych
In line:
Gdy twoje funkcje są małe poprzedź je wyrażeniem
stałym „inline”
Pytanie kontrolne I
Rekurencja to:
a)
Funkcja języka C++
b)
Typ zmiennej
c)
Odwoływanie się funkcji do samej siebie
d)
Cecha estymatora klasycznej metody
najmniejszych kwadratów
Pytanie kontrolne II
Derekursywacji dokonujemy w celu:
a)
Zwiększenia wydajności programu
b)
Jest to czysto akademicka teoria
c)
Uporządkowania kodu
d)
Jest konieczna aby program uruchomił się na
linuxie
Pytanie kontrolne III
Co jest szybsze:
a)
Rekurencja
b)
Iteracja
c)
Nie ma różnicy
d)
Jest to zależne od procesora
Pytanie kontrolne IV
Duże switche najlepiej:
a)
Rozdzielać na mniejsze
b)
Zagnieżdżać w sobie
c)
Odradza się używanie switchy
d)
Żadna z powyższych odpowiedzi