Na podstawie opublikowanych sugestii przeprowadziłem kilka dodatkowych testów. Wygląda na to, że wydajność osiąga się, gdy ta sama macierz jest przywoływana zarówno w LHS, jak i w RHS zadania.
Moja teoria mówi, że MATLAB wykorzystuje wewnętrzny mechanizm liczenia referencji/kopiowania przy zapisie, a to powoduje, że cała macierz jest kopiowana wewnętrznie, gdy jest przywoływana po obu stronach. (To jest domysły, ponieważ nie znam elementów wewnętrznych MATLAB).
Oto wyniki wywołania funkcji 885548 razy. (Różnica polega na tym, że cztery razy, a nie dwanaście, jak pierwotnie napisałem, każda z funkcji ma dodatkową funkcję owijania w głowie, podczas gdy w moim pierwszym wpisie właśnie podsumowałem poszczególne linie).
swap1: 12.547 s
swap2: 14.301 s
swap3: 51.739 s
Oto kod:
methods (Access = public)
function swap(self, i1, i2)
swap1(self, i1, i2);
swap2(self, i1, i2);
swap3(self, i1, i2);
self.SwapCount = self.SwapCount + 1;
end
end
methods (Access = private)
%
% swap1: stores values in temporary doubles
% This has the best performance
%
function swap1(self, i1, i2)
e1 = self.Data(i1);
e2 = self.Data(i2);
self.Data(i1) = e2;
self.Data(i2) = e1;
end
%
% swap2: stores values in a temporary matrix
% Marginally slower than swap1
%
function swap2(self, i1, i2)
m = self.Data([i1, i2]);
self.Data([i2, i1]) = m;
end
%
% swap3: does not use variables for storage.
% This has the worst performance
%
function swap3(self, i1, i2)
self.Data([i1, i2]) = self.Data([i2, i1]);
end
end
Jestem ciekaw dlaczego PO nie wspomniał o tym. – Jeff