повышение производительности кода MATLAB с узкими местами анонимных функций

Я столкнулся с серьезными проблемами производительности с анонимными функциями в Matlab 2011a, где накладные расходы, вносимые анонимной функцией-контейнером, намного больше, чем время, затрачиваемое самой закрытой функцией.

Я прочитал пару связанных вопросов, в которых пользователи помогли объяснить, что это проблема, с которой сталкиваются другие, показывая, что я могу значительно повысить производительность, отказавшись от анонимных контейнеров. К сожалению, мой код структурирован таким образом, что я не знаю, как это сделать, не нарушив при этом многие вещи.

Итак, есть ли обходные пути для повышения производительности анонимных функций, не избавляясь от них полностью, или шаблоны проектирования, которые позволили бы мне избавиться от них, не раздувая мой код и не тратя много времени на рефакторинг?

Некоторые подробности это может помочь:

Ниже представлена ​​коллекция анонимных функций, которые хранятся как свойство класса. Использование массива int, который, в свою очередь, используется оператором switch, может в принципе заменить массив, но содержимое GP может быть изменено - существуют другие функции с той же структурой аргументов, что и traingps, которые могут использоваться там - и В некоторых случаях содержимое 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% от общего времени (1,7 секунды для 44 вызовов !), по сравнению с 5% для содержащейся функции. Я использую аналогичный подход в другом месте, где стоимость анонимной оболочки даже выше пропорционально.

Есть ли у кого-нибудь мысли о том, как уменьшить накладные расходы на анонимные вызовы или, в отсутствие этого, как заменить анонимную функцию, сохранив при этом гибкость, которую они предоставляют (и не вводя кучу дополнительных бухгалтерских операций и передачи аргументов)?

Спасибо!

6
задан Amro 30 October 2011 в 02:35
поделиться