Было бы неплохо использовать «фрагмент дескриптора развертывания веб-модуля» (он же web-фрагмент.xml), представленный в спецификации Servlet 3.0 . Спецификация определяет его следующим образом:
Веб-фрагмент представляет собой логическое разбиение веб-приложения таким образом, что фреймворки, используемые в веб-приложении, могут определять все артефакты, не запрашивая разработчиков или редакторов. добавить информацию в web.xml.
Java EE 6, возможно, сейчас не вариант для вас. Тем не менее, это будет стандартизированное решение.
Вы обманываете вложенную функцию. :) Анонимная функция вызывается внутри цикла, поэтому вы измеряете стоимость ее вызова 100000 раз. Вложенная функция вызывается только один раз, поэтому накладные расходы на вызов функции незначительны. Чтобы сравнить стоимость вызова анонимных и именованных функций, вы должны сделать так, чтобы вложенная функция выполняла ту же работу, что и анонимная функция, а затем вызывала ее изнутри цикла.
Я сделал это, но все равно получил аналогичные результаты. Анонимная функция примерно в 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
Я получил это на R2009b в Windows.
>> speedtest direct: 0 nested: 0.0469 nested_handle: 0.0781 subfunction: 0.0313 subfunction_handle: 0.0313 anonymous: 1.2344
Другой способ взглянуть на это - структурировать свой код таким образом, чтобы он «векторизовался» и работал с массивами, уменьшая количество вызовов функций и стоимость вызова функции не имеет большого значения.
Я могу подтвердить ваши выводы, Грав. На моем компьютере функция speedtest возвращает следующее:
>> speedtest()
ans =
0 0.0313 1.3906
Кстати, функция cputime - не лучший метод измерения времени вычислений. Вместо этого используйте функции tic и toc. см. Ссылку Эти функции обеспечивают гораздо более высокое разрешение по времени, и, используя их, я получаю следующее:
>> speedtest()
ans =
0.0062 0.0162 1.3495
Results from a Windows machine, Matlab 2009a
>> test
ans =
0 0.0156 1.1094