Медленная производительность с помощью анонимных функций в MATLAB … другие заметила это?

Было бы неплохо использовать «фрагмент дескриптора развертывания веб-модуля» (он же web-фрагмент.xml), представленный в спецификации Servlet 3.0 . Спецификация определяет его следующим образом:

Веб-фрагмент представляет собой логическое разбиение веб-приложения таким образом, что фреймворки, используемые в веб-приложении, могут определять все артефакты, не запрашивая разработчиков или редакторов. добавить информацию в web.xml.

Java EE 6, возможно, сейчас не вариант для вас. Тем не менее, это будет стандартизированное решение.

6
задан gnovice 5 November 2009 в 04:29
поделиться

3 ответа

Вы обманываете вложенную функцию. :) Анонимная функция вызывается внутри цикла, поэтому вы измеряете стоимость ее вызова 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

Другой способ взглянуть на это - структурировать свой код таким образом, чтобы он «векторизовался» и работал с массивами, уменьшая количество вызовов функций и стоимость вызова функции не имеет большого значения.

16
ответ дан 8 December 2019 в 12:20
поделиться

Я могу подтвердить ваши выводы, Грав. На моем компьютере функция speedtest возвращает следующее:

>> speedtest()
ans =
         0    0.0313    1.3906

Кстати, функция cputime - не лучший метод измерения времени вычислений. Вместо этого используйте функции tic и toc. см. Ссылку Эти функции обеспечивают гораздо более высокое разрешение по времени, и, используя их, я получаю следующее:

>> speedtest()
ans =
         0.0062    0.0162    1.3495
1
ответ дан 8 December 2019 в 12:20
поделиться

Results from a Windows machine, Matlab 2009a

>> test

ans =

     0    0.0156    1.1094
1
ответ дан 8 December 2019 в 12:20
поделиться
Другие вопросы по тегам:

Похожие вопросы: