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称为匿名函数)。

但是,性能似乎受到了严重打击。在下面的示例中,我比较了不同的方法。 (代码段包装在一个函数中,以便能够使用子函数)

我得到的结果是直接为0秒,使用子函数几乎为0秒,使用匿名函数为5秒。我正在OS X 10.6和C2D 1.8 GHz上运行MATLAB 7.7(R2007b)。

任何人都可以运行代码并查看得到的内容吗?我对Windows的性能特别感兴趣。

function [] = speedtest() clear all; close all; function y = foo(x) y = zeros(1,length(x)); for j=1:N y(j) = x(j)^2; end end x = linspace(-100,100,100000); N = length(x); %% direct t = cputime; y = zeros(1,N); for i=1:N y(i) = x(i)^2; end r1 = cputime - t; %% using subfunction t = cputime; y = foo(x); r2 = cputime - t; %% using anon function fn = @(x) x^2; t = cputime; y = zeros(1,N); for i=1:N y(i) = fn(x(i)); end r3 = cputime-t; [r1 r2 r3] end
回答:
您在使用嵌套函数作弊。 :)匿名函数在循环内被调用,因此您要衡量其调用十万次的成本。嵌套函数仅被调用一次,因此其函数调用开销可忽略不计。为了比较调用匿名函数和命名函数的成本,您应该让嵌套函数执行与匿名函数相同的工作,然后再从循环内部调用它。

我做到了,仍然得到了类似的结果。匿名功能要慢20倍左右。

但是,您仍然可以将函数句柄与非匿名函数一起使用,并且其性能不会与匿名函数相同。这可以与嵌套函数(如原始测试中的foo)一起使用,也可以与非嵌套子函数(不充当闭包,并且可能具有较少的开销)一起使用。

function [] = speedtest() function y = foo(x) y = x^2; end r = struct; ... %% using nested function through function handle fn = @foo; y = zeros(1,N); t = cputime; for i=1:N y(i) = fn(x(i)); end r.nested_handle = cputime - t; ... %% using subfunction through function handle fn = @subfunction_foo; y = zeros(1,N); t = cputime; for i=1:N y(i) = fn(x(i)); end r.subfunction_handle = cputime - t; ... end % end function speedtest function y = subfunction_foo(x) y = x^2; end 我在Windows的R2009b上得到了这个。

>>速度测试 直接:0 嵌套:0.0469 nested_handle:0.0781 子功能:0.0313 subfunction_handle:0.0313 匿名:1.2344另一种看待它的方法是对代码进行结构化,以使其“矢量化”并在数组上运行,从而减少了函数调用的次数,而函数调用的成本无关紧要。 Matlab会更惯用:典型的性能建议是忽略函数调用和循环的开销,因为无论如何您应该对较大的参数进行较少的调用。



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

主题工具
显示模式

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

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



所有时间均为北京时间。现在的时间是 03:25


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