Снижение производительности постоянных переменных в MATLAB

Недавно я профилировал некоторый код MATLAB и был потрясен, увидев следующее в часто используемой функции:

5.76  198694   58 persistent CONSTANTS; 
3.44  198694   59 if isempty(CONSTANTS) % initialize CONSTANTS

Другими словами, MATLAB потратил около 9 секунд на 198694 вызовов функций, объявляя постоянный CONSTANTS и проверяя, был ли он инициализирован. Это составляет 13 % от общего времени, затраченного на эту функцию.

Действительно ли постоянные переменные так сильно снижают производительность в MATLAB? Или мы делаем что-то ужасно неправильно здесь?

ОБНОВЛЕНИЕ

@Andrew Эндрю Я попробовал ваш пример сценария, и я очень, очень озадачен результатом:

time   calls  line
                6 function has_persistent
6.48  200000    7 persistent CONSTANTS 
1.91  200000    8 if isempty(CONSTANTS) 
                9     CONSTANTS = 42;
               10 end

Я попробовал команду Bench (), и она показала, что моя машина находится в среднем диапазоне машин-образцов. Запуск 64-битной версии Ubuntu на процессоре Intel(R) Core(TM) i7, 4 ГБ ОЗУ.


person lindelof    schedule 26.09.2010    source источник
comment
Какую версию Матлаба вы используете?   -  person mtrw    schedule 30.09.2010
comment
MATLAB версии 7.10.0.499 (R2010a)   -  person lindelof    schedule 30.09.2010


Ответы (1)


Это стандартный способ использования постоянных переменных в Matlab. Ты делаешь то, что должен. Для этого будут заметные накладные расходы, но ваши тайминги кажутся на удивление высокими.

Вот аналогичный тест, который я провел в 32-разрядной версии Matlab R2009b на машине с процессором Intel Core 2 QX9650 с тактовой частотой 3,0 ГГц под Windows XP x64. Аналогичные результаты на других машинах и версиях. Примерно в 5 раз быстрее, чем ваше время.

Контрольная работа:

function call_has_persistent
for i = 1:200000
    has_persistent();
end

function has_persistent
persistent CONSTANTS
if isempty(CONSTANTS)
    CONSTANTS = 42;
end

Результаты:

  0.89  200000    7 persistent CONSTANTS 
  0.25  200000    8 if isempty(CONSTANTS) 

На какой версии Matlab, ОС и процессоре вы работаете? Чем инициализируются КОНСТАНТЫ? Вывод Bench() Matlab кажется приемлемым для вашей машины?

Ваши тайминги кажутся высокими. Там может быть ошибка или проблема с конфигурацией, которую нужно исправить. Но если вы действительно хотите быстро получить код Matlab, стандартный совет состоит в том, чтобы «векторизировать» его: реструктурировать код так, чтобы он делал меньше вызовов функций для больших входных массивов и использовал встроенные векторизованные функции Matlab вместо циклов или управления. структур, чтобы избежать 200 000 вызовов функции в первую очередь. Если возможно. Matlab имеет относительно высокие накладные расходы на вызов функции или метода (см. Является ли MATLAB OOP медленным или я делаю что-то не так? для некоторых чисел), поэтому вы часто можете получить больше преимуществ, рефакторинг, чтобы исключить вызовы функций, вместо того, чтобы делать вызовы отдельных функций быстрее.

Возможно, стоит протестировать некоторые другие основные операции Matlab на вашем компьютере, чтобы увидеть, является ли это просто «постоянным», которое кажется медленным. Также попробуйте профилировать только этот небольшой тестовый скрипт call_has_persistent изолированно, чтобы увидеть, имеет ли значение контекст вашей функции.

person Andrew Janke    schedule 27.09.2010