我在Matlab 2011a中使用匿名函数遇到了严重的性能问题,其中匿名容器函数引入的开销远大于所包含函数本身所需的时间。
我读了一些相关的问题,用户们都很热心地解释说这是其他人也经历过的问题,他们表明如果不使用匿名容器,我可以通过这种方式显著提高性能。不幸的是,我的代码结构使我不确定如何在不破坏很多东西的情况下做到这一点。
因此,有没有方法来改善匿名函数的性能,而不完全放弃它们,或者有没有设计模式可以让我放弃它们而不会膨胀我的代码并花费大量时间进行重构?
以下是匿名函数的集合,它们被存储为类属性。原则上,可以使用一个整数数组来替换数组,该数组反过来由switch语句使用,但GPs的内容可能会发生变化--还有其他具有与traingps相同参数结构的函数可以在那里使用--而且GPs的内容在某些情况下可能是在运行时确定的。
稍后,GP的元素将通过类的成员函数进行调用,如下所示:
我读了一些相关的问题,用户们都很热心地解释说这是其他人也经历过的问题,他们表明如果不使用匿名容器,我可以通过这种方式显著提高性能。不幸的是,我的代码结构使我不确定如何在不破坏很多东西的情况下做到这一点。
因此,有没有方法来改善匿名函数的性能,而不完全放弃它们,或者有没有设计模式可以让我放弃它们而不会膨胀我的代码并花费大量时间进行重构?
以下是匿名函数的集合,它们被存储为类属性。原则上,可以使用一个整数数组来替换数组,该数组反过来由switch语句使用,但GPs的内容可能会发生变化--还有其他具有与traingps相同参数结构的函数可以在那里使用--而且GPs的内容在某些情况下可能是在运行时确定的。
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%。我在其他地方使用了类似的方法,其中匿名包装器的成本甚至更高,按比例算。
请问有没有任何想法可以减少匿名调用的开销?如果不行,有没有办法在保留它们提供的灵活性的同时替换匿名函数(而不引入大量的额外记录和参数传递)?
谢谢!