GNU Octave/Wydajność

(Przekierowano z GNU Octave/Wydajnosc)

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
  1. Profiler example by Daniel Jordi
  2. Wprowadzenie do metod numerycznych - programu studiów informatyki na wydziale MIMUW
  3. Course in Octave by Finn Haugen
  4. Tips Vectorizing from Octavew wiki
  5. Matlab Speedup tricks by Matt Dunham and Kevin Murphy
  6. How to speed up MATLAB and Octave by Vectorization by Matt Oneal
  7. numeryczne I - Janusz Szwabiński