W celu refaktoryzacji mojego kodu MATLAB, myślałem, że będę przekazywał funkcje jako argumenty (co MATLAB nazywa anonimowymi funkcjami), inspirowane funkcjonalnym programowaniem.Powolna wydajność przy użyciu anonimowych funkcji w MATLAB ... czy inni to zauważyli?
Wydaje się jednak, że wydajność została uderzona dość poważnie. W poniższych przykładach porównuję różne podejścia. (Fragment kodu jest zawijany w funkcję, aby móc korzystać z podfunkcji).
Otrzymany wynik to 0 sekund dla bezpośredniego, prawie 0 sekund przy użyciu podfunkcji i 5 sekund przy użyciu anonimowych funkcji. Używam MATLAB 7.7 (R2007b) na OS X 10.6, na C2D 1,8 GHz.
Czy każdy może uruchomić kod i zobaczyć, co otrzyma? Szczególnie interesuje mnie wydajność w systemie Windows.
function [] = speedtest()
clear all; close all;
function y = foo(x)
y = zeros(1,length(x));
for j=1:N
y(j) = x(j)^2;
end
end
x = linspace(-100,100,100000);
N = length(x);
%% direct
t = cputime;
y = zeros(1,N);
for i=1:N
y(i) = x(i)^2;
end
r1 = cputime - t;
%% using subfunction
t = cputime;
y = foo(x);
r2 = cputime - t;
%% using anon function
fn = @(x) x^2;
t = cputime;
y = zeros(1,N);
for i=1:N
y(i) = fn(x(i));
end
r3 = cputime-t;
[r1 r2 r3]
end
Co jest dokładnie Twoje pytanie ?? – Amro
Zastanawiam się, dlaczego i tak robisz takie zbyt skomplikowane obliczenia ... możesz zastąpić potrzebę pętli for za pomocą operacji wektorowych. Na przykład 'y = x.^2;' wyrówna każdy element 'x' i zapisze wynikowy wektor w' y'. – gnovice
FYI: podobne pytanie na temat skuteczności metody OOP: http://stackoverflow.com/questions/1693429/matlab-oop-is-it-slow- or-am-i-doing-something-wrong/1745686#1745686 –