Basé sur des suggestions postées, j'ai effectué quelques tests supplémentaires. Il semble que le coup de performance survienne lorsque la même matrice est référencée à la fois dans le LHS et le RHS de l'affectation. Ma théorie est que MATLAB utilise un mécanisme interne de comptage de références/copie sur écriture, ce qui provoque la copie interne de la matrice entière lorsqu'elle est référencée des deux côtés. (Ceci est une supposition car je ne connais pas les internes de MATLAB).
Voici les résultats de l'appel de la fonction 885548 fois. (La différence ici est quatre fois, pas douze fois, comme je l'ai écrit à l'origine.) Chacune des fonctions a le surcouple de fonctions, alors que dans mon post initial je viens de résumer les lignes individuelles.
swap1: 12.547 s
swap2: 14.301 s
swap3: 51.739 s
Voici le code:
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
Je suis curieux de savoir pourquoi OP n'a pas mentionné cela. – Jeff