MATLAB: Проблема производительности с анонимными функциями

Оптимизируя мой код MATLAB, я наткнулся на странную проблему, касающуюся анонимных функций.

Как и в этом потоке Я понял, что иногда анонимные функции работают очень медленно. Но с минимальными изменениями функции она работает так же быстро, как подфункции или вложенные функции.

Я использовал этот (простой) тестовый файл, чтобы воспроизвести поведение с Matlab R2010b в 64-разрядной версии Windows 7:

clear all; close all; clc;

% functions
fn1 = @(x) x^2;
fn2 = @(x) double(x^2);

% variables
x = linspace(-100,100,100000);
N = length(x);

%% anonymous function
y = zeros(1,N);
t = tic;
for i=1:N
    y(i) = fn1(x(i));
end
tm.anonymous_1 = toc(t);

%% anonymous function (modified)
y = zeros(1,N);
t = tic;
for i=1:N
    y(i) = fn2(x(i));
end
tm.anonymous_2 = toc(t);

%% print
tm

Результаты, которые я получил были:

tm = 

    anonymous_1: 1.0605
    anonymous_2: 0.1217

Как видите, первый подход примерно в 10 раз медленнее. Понятия не имею, что вызывает это ускорение / замедление. Я пробовал разные вещи, получая почти одинаковые (быстрые) тайминги:

fn2 = @(x) 1 * x^2;
fn2 = @(x) 0 + x^2;
fn2 = @(x) abs(x^2);
fn2 = @(x) x*x;


Прежде чем я начну профилировать все свои функции, Я хотел бы знать, есть ли у кого-нибудь объяснение такого поведения?


PS: Я знаю, что "векторизованные" подходы намного быстрее, но в моем случае решатель будет оценивать функцию для каждого переменного временного шага, так что это не вариант.

12
задан Community 23 May 2017 в 12:10
поделиться