Chr*_*ris 6 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]')};
Run Code Online (Sandbox Code Playgroud)
之后,GP的元素由类的成员函数调用,如下所示:
GPt = GPs{t(j)}(xj,yj,gridX(xi),thetaT(1),thetaT(2:end));
Run Code Online (Sandbox Code Playgroud)
根据分析器,匿名包装器的自我时间占总时间的95%(44次调用为1.7秒!),而所包含的函数为5%.我在其他地方使用类似的方法,按比例说,匿名包装器的成本更高.
有没有人对如何减少匿名调用的开销有任何想法,或者,如果没有,如何替换匿名函数同时保留他们提供的灵活性(并且不引入一堆额外的簿记和参数传递)?
谢谢!
这一切都取决于你为了提高表现愿意忍受多少痛苦。这是避免使用匿名函数的一个技巧。我不知道它会如何为您介绍。我相信您可以将这些“微小”函数放在类文件的末尾(我知道您可以将它们放在常规函数文件的末尾。)
function [output] = GP1(x,ytrain,xstar,noisevar,params)
output = traingp(X,ytrain,xStar,noisevar,1,params,[1 0]);
end
...
m3.GPS = {@GP1, @GP2, ...};
Run Code Online (Sandbox Code Playgroud)