通过匿名功能瓶颈提高matlab代码的性能

时间:2011-10-28 16:17:45

标签: performance matlab anonymous-function

我在matlab 2011a中遇到了严重的匿名函数性能问题,其中匿名容器函数引入的开销远远大于封闭函数本身所花费的时间。

我已经阅读了几个相关的问题,其中用户帮助解释了这是其他人遇到的问题,这表明我可以通过取消匿名容器来大幅提高性能。不幸的是,我的代码结构是这样的,我不知道怎么做而不会破坏很多东西。

那么,是否有改进匿名函数性能的解决方法,而不是完全取消它们,或者设计模式可以让我在不夸大我的代码并花费大量时间重构的情况下取消它们?

可能会有所帮助的一些细节:

下面是匿名函数的集合,它们存储为类属性。使用由switch语句反过来使用的int数组原则上可以替换数组,但是GP的内容可能会发生变化 - 还有其他函数具有与可以在那里使用的traing相同的参数结构 - 和在某些情况下,GP的内容可能会在运行时确定。

m3.GPs = {@(X,ytrain,xStar,noisevar,params)traingp(X,ytrain,xStar,noisevar,1,params,[1  0]');
       @(X,ytrain,xStar,noisevar,params)traingp(X,ytrain,xStar,noisevar,1,params,[-1 1]');
       @(X,ytrain,xStar,noisevar,params)traingp(X,ytrain,xStar,noisevar,2,params,0);
       @(X,ytrain,xStar,noisevar,params)traingp(X,ytrain,xStar,noisevar,3,params,0);
       @(X,ytrain,xStar,noisevar,params)traingp(X,ytrain,xStar,noisevar,4,params,[0 0 0]')};

稍后,GP的元素由类的成员函数调用,如下所示:

GPt = GPs{t(j)}(xj,yj,gridX(xi),thetaT(1),thetaT(2:end));

根据探查器,匿名包装器的自我时间占总时间的95%(44次呼叫为1.7秒!),而所包含的功能为5%。我在其他地方使用类似的方法,按比例说,匿名包装器的成本更高。

有没有人对如何减少匿名调用的开销有任何想法,或者,如果没有,如何替换匿名函数同时保留他们提供的灵活性(而不是引入一堆额外的簿记和参数传递)?

谢谢!

2 个答案:

答案 0 :(得分:1)

这一切都取决于你愿意忍受多少痛苦以提高表现。这是避免匿名函数的一个技巧。我不知道它会如何描述你。您可以将这些“微小”函数放在我认为的类文件末尾(我知道您可以将它们放在常规函数文件的末尾。)

function [output] = GP1(x,ytrain,xstar,noisevar,params)
   output = traingp(X,ytrain,xStar,noisevar,1,params,[1  0]);
end
...

m3.GPS = {@GP1, @GP2, ...}; 

答案 1 :(得分:1)

也许功能“工厂”会有所帮助:

>> factory = @(a,b,c) @(x,y,z) a*x+b*y+c*z;
>> f1 = factory(1,2,3);
>> f2 = factory(0,1,2);
>> f1(1,2,3)
ans =
    14
>> f1(4,5,6)
ans =
    32
>> f2(1,2,3)
ans =
     8
>> f2(4,5,6)
ans =
    17

这里,factory是一个返回具有不同参数的新函数的函数。另一个例子可能是:

 factory = @(a,b,c) @(x,y,z) some_function(x,y,z,a,b,c)

返回指定x,y,z的{​​{1}}函数。