Weźmy pod uwagę prosty przykład. Nasz program wymaga wielokrotnych konwersji z układu współrzędnych kartezjańskich na biegunowe. Załóżmy, że konwersja jest dokonywana w pętli (na przykład dlatego, że każdy następny krok zależy od poprzedniego).
Matlab ma wbudowaną funkcję:
[THETA,RHO] = cart2pol(X,Y);
Do testowania wydajności przygotujemy sobie zbiór danych wejściowych:
v = randn(1000000,2)*1000;
Teraz dla każdej pary wartości (x, y) ze zmiennej v przeliczmy współrzędne:
for a = 1:length(v) [t r] = cart2pol(v(a,1),v(a,2)); end
Wykonanie powyższej pętli zajmuje na moim komputerze 11.692266 sekund.
Przeanalizujmy co robi funkcja cart2pol:
function [th,r,z] = cart2pol(x,y,z) th = atan2(y,x); r = hypot(x,y); end
O ile atan2 jest operacją matematyczną, to hypot jest kolejną funkcją, która zwraca pierwiastek sumy kwadratów dwóch argumentów.
Co się zatem stanie jeśli wykonamy pętle z przykładu wyżej, ale zamiast funkcji cart2pol wywołamy obliczenia bezpośrednio?
for a = 1:length(v) t = atan2(v(a,2),v(a,1)); r = sqrt(v(a,1)^2+v(a,2)^2); end
Efekt jest identyczny. Różnica polega na tym, że czas obliczenia został zredukowany do 0.329579 sekundy, co daje przyspieszenie ponad 36 razy…
Wniosek – kod w matlabie warto analizować i optymalizować!
adres |