Это список фактов, которые я собрал. Вместо ГХ термин выделение памяти (де) представляется более подходящим в этом контексте.
Мой основной источник информации - блог Лорен (особенно его комментарии) и эта статья из MATLAB Digest.
Из-за своей ориентации на численные вычисления с возможными большими наборами данных MATLAB действительно хорошо справляется с оптимизацией стековых объектов производительности, например, используя операции на месте с данными и вызов по ссылке для аргументов функции. Кроме того, благодаря своей ориентации модель памяти принципиально отличается от таких ОО-языков, как Java.
У MATLAB официально не было пользовательской кучи памяти до версии 7 (в версии 6 была недокументированная функциональность reference
в файлах schema.m
). MATLAB 7 имеет кучу как в виде вложенных функций (замыканий), так и для обработки объектов , их реализация разделяет одни и те же основы. Как примечание стороны, OO может быть эмулированным с замыканиями в MATLAB (интересно до 2008a).
Удивительно, но можно изучить всю рабочую область включающей функции, захваченную дескриптором функции (замыкание), см. Функцию functions (fhandle) в справке MATLAB. Это означает, что рабочая область заморожена в памяти. Вот почему cellfun/arrayfun
иногда очень медленный при использовании внутри вложенных функций.
Есть также интересные сообщения Лорен и Брэда Фелана об очистке объекта.
Самым интересным фактом об освобождении кучи в MATLAB является, на мой взгляд, то, что MATLAB пытается делать это каждый раз, когда происходит освобождение стека, т.е. при выходе из каждой функции. Это имеет преимуществ , но также является огромным штрафом процессора, если освобождение кучи происходит медленно. И на самом деле это очень медленно в MATLAB в некоторых сценариях!
Проблемы производительности освобождения памяти MATLAB, которые могут ударить по коду, довольно серьезны. Я всегда замечаю, что непреднамеренно представляю циклические ссылки в своем коде, когда он неожиданно работает в 20 раз медленнее и иногда требуется несколько секунд между выходом из функции и возвратом к вызывающей стороне (время, потраченное на очистку). Это известная проблема, см. Дейв Фоти и в этом старом посте на форуме , код которого используется для визуализации производительности этой картины (тесты проводятся на разных машинах, поэтому сравнение абсолютных временных интервалов для разных MATLAB версии не имеет смысла):
Линейное увеличение размера пула для объектов-ссылок означает полиномиальное (или экспоненциальное) снижение производительности MATLAB! Для объектов-значений производительность, как и ожидалось, линейна.
Учитывая эти факты, я могу только предположить, что MATLAB использует еще не очень эффективную форму подсчета ссылок для освобождения кучи.
EDIT : я всегда сталкивался с проблемой производительности с множеством небольших вложенных функций, но недавно я заметил, что по крайней мере с 2006a очистка одиночной вложенной области действия с некоторые мегабайты данных также ужасны, требуется всего 1,5 секунды, чтобы установить пустую переменную вложенной области видимости!
РЕДАКТИРОВАТЬ 2 : наконец я получил ответ - от самого Дэйва Фоти . Он признает недостатки, но говорит, что MATLAB собирается сохранить свой нынешний подход к детерминированной очистке.
Легенда: чем меньше время выполнения, тем лучше