Labfans是一个针对大学生、工程师和科研工作者的技术社区。 | 论坛首页 | 联系我们(Contact Us) |
![]() |
|
![]() |
#1 |
高级会员
注册日期: 2019-11-21
帖子: 3,006
声望力: 66 ![]() |
![]()
纯粹作为实验,我在MATLAB中编写排序函数,然后通过MATLAB profiler运行它们。我发现最困惑的方面是交换元素。
我发现交换矩阵中两个元素的“正式”方式 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秒 交换2:14.301秒 交换3:51.739秒这是代码: 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 更多&回答... |
![]() |
![]() |