Labfans是一个针对大学生、工程师和科研工作者的技术社区。 论坛首页 | 联系我们(Contact Us)
MATLAB爱好者论坛-LabFans.com
返回   MATLAB爱好者论坛-LabFans.com > 其它 > 资料存档
资料存档 资料存档
 
 
主题工具 显示模式
旧 2019-12-10, 16:49   #1
poster
高级会员
 
注册日期: 2019-11-21
帖子: 3,006
声望力: 66
poster 正向着好的方向发展
帖子 在MATLAB中交换两个元素的性能

纯粹作为实验,我在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

更多&回答...
poster 当前离线   回复时引用此帖
 


发帖规则
不可以发表新主题
不可以发表回复
不可以上传附件
不可以编辑自己的帖子

启用 BB 代码
论坛禁用 表情符号
论坛启用 [IMG] 代码
论坛启用 HTML 代码



所有时间均为北京时间。现在的时间是 19:48


Powered by vBulletin
版权所有 ©2000 - 2025,Jelsoft Enterprises Ltd.