Нарушение производительности постоянных переменных в MATLAB - PullRequest
5 голосов
/ 27 сентября 2010

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

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

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

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

ОБНОВЛЕНИЕ

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

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® Core ™ TM i7, 4 ГБ ОЗУ.

1 Ответ

8 голосов
/ 27 сентября 2010

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

Вот аналогичный тест, который я провел в 32-разрядной версии Matlab R2009b на 3-ГГц машине 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, ОС и ЦП вы работаете?С чем инициализируется CONSTANTS?Кажется ли вывод Matlab's bench () разумным для вашей машины?

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

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

...