На основании опубликованных предложений я провел еще несколько тестов.
Похоже, что снижение производительности происходит, когда одна и та же матрица указана в LHS и RHS назначения.
Моя теория состоит в том, что MATLAB использует внутренний механизм подсчета ссылок / копирования при записи, и это вызывает внутреннее копирование всей матрицы, когда на нее ссылаются с обеих сторон. (Это предположение, потому что я не знаю, что такое MATLAB).
Вот результаты вызова функции 885548 раз. (Разница здесь в четыре раза, а не в двенадцать, как я первоначально разместил. Каждая из функций имеет дополнительные издержки переноса функций, в то время как в моем первоначальном посте я просто суммировал отдельные строки).
swap1: 12.547 s
swap2: 14.301 s
swap3: 51.739 s
Вот код:
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