GNU Octave/Wydajność
Profilowanie
[edytuj]Z użyciem profilera [1]
profile on; foo; profile off; data = profile ('info'); profshow (data, 10);
Ten kod nie działa !!!
Działa z użyciem timera:
tic; foo; toc;
Wektoryzacja
[edytuj]"umiejętność wektoryzacji i blokowania algorytmów jest podstawą pisania efektywnych implementacji algorytmów w Octave." [2]
Wektoryzacja to używanie funkcji działających na wektorach lub tablicach (danych złożonych) zamiast na pojedynczych danych. Ponieważ te funkcje są zoptymalizowane czas wykonywania kodu z wektoryzacją jest krótszy niż kody bez wektoryzacji (np. z pętlami for).:[3][4]
Użycie wektorów jest kilka razy szybsze[5]
Ujemną stroną wektoryzacji jest mniejsza czytelność kodu.
Zoptymalizowane funkcje
[edytuj]Przykład sumowania w sposób tradycyjny (pętla for) i funkcja sum:
Z użyciem pętli:[6]
clear tic(); x = 0; for n = 1:1e6 x = x + n; end x exec_time = toc()
z użyciem wektorów:
clear tic(); s = sum(1:1e6); exec_time = toc()
Wynik w obu programach jest ten sam (5.0000e+11), a czas krótszy w przypadku użycia funkcji sum:
- exec_time = 3.4966 (dla pętli for)
- exec_time = 1.7213 (dla funkcji sum)
Podany czas jest przykładowym wynikiem na 2 rdzeniowym komputerze.
Arrayfun
[edytuj]Anonimowa funkcja:
octave:1> f = @(x) sin(x)*x
f = @(x) sin (x)*x
Przypuśćmy, że chcemy obliczyć wynik tej funkcji dla każdego elementu wektora y:
octave:2> y=1:7
y = 1 2 3 4 5 6 7
Użycie y jako argumentu funkcji f powoduje błąd:
octave:3> f(y) error: operator *: nonconformant arguments (op1 is 1x7, op2 is 1x7) error: called from: error: at line -1, column -1
ponieważ zgodnie z definicją funkcja f nie przyjmuje wektorów. Możemy to ominąć poprzez zastosowanie arrayfun:
octave:4> arrayfun(f,y)
i otrzymujemy pożądany wynik:
ans = 0.84147 1.81859 0.42336 -3.02721 -4.79462 -1.67649 4.59891
Dokładność w obliczeniach numerycznych
[edytuj]Przeanalizujmy następujący przykład:[7]
octave:1> x=2^30; octave:2> x+2^-22==x ans = 0 octave:3> x+2^-23==x ans = 1
Liczba bitów używana przez Octave jest zbyt mała aby przedstawić wszystkie liczby dokładnie.
Źródła
[edytuj]- ↑ Profiler example by Daniel Jordi
- ↑ Wprowadzenie do metod numerycznych - programu studiów informatyki na wydziale MIMUW
- ↑ Course in Octave by Finn Haugen
- ↑ Tips Vectorizing from Octavew wiki
- ↑ Matlab Speedup tricks by Matt Dunham and Kevin Murphy
- ↑ How to speed up MATLAB and Octave by Vectorization by Matt Oneal
- ↑ numeryczne I - Janusz Szwabiński