纯粹作为一个实验,我在MATLAB中编写排序函数,然后通过MATLAB分析器运行它们.我觉得最令人困惑的方面是交换元素.
我发现在矩阵中交换两个元素的"官方"方式
self.Data([i1, i2]) = self.Data([i2, i1])
运行速度比在四行代码中运行要慢得多:
e1 = self.Data(i1); e2 = self.Data(i2); self.Data(i1) = e2; self.Data(i2) = e1;
第二个示例占用的总时间长度比第一个示例中的单行代码少12倍.
有人会解释为什么?
根据发布的建议,我进行了一些测试.当分配的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