2010-09-26 2 views
5

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

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

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

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

UPDATE

Я попробовал @ Андрей свой образец сценария, и я очень, очень озадачен выход:

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 

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

+0

Какая версия Matlab вы используете? – mtrw

+0

MATLAB Version 7.10.0.499 (R2010a) – lindelof

ответ

8

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

Вот аналогичный тест, который я провел в 32-битном Matlab R2009b на 3,0 ГГц процессоре Intel Core 2 QX9650 под 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 версия, OS, и CPU вы работаете на? С чего инициализируются CONSTANTS? Результат Matlab bench() кажется разумным для вашей машины?

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

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