Я обнаружил исправление для моей конкретной проблемы, которое может быть применимо в целом.
Функция, для которой потребовалось много времени, была вызвана для базового объекта, который содержал вектор объектов-дескрипторов.Когда я изменил определение базового объекта для расширения дескриптора, я устранил задержку при закрытии функции.
Я считаю, что происходило следующее: когда я передавал базовый объект своей функции, он создавалкопия этого объекта (по умолчанию MATLAB передается по значению).Это не занимает много времени, но когда функция закрывается, она уничтожает копию объекта, в результате чего она просматривает вектор объектов-дескрипторов, чтобы убедиться, что нет никаких сирот, которые нужно было очистить.Я полагаю, что эта операция выполняла MATLAB долгое время.
Когда я изменил объект, который передавал дескриптору, в рабочем пространстве функции не было выполнено ни одной копии, поэтому очистка объекта не требовалась приконец.
Это подсказывает мне общее правило:
Если функции требуется много времени для очистки своего рабочего пространства при выходе, и вы передаете много данных или сложных структур с помощьюзначение, попробуйте инкапсулировать аргументы этой функции в объекте-дескрипторе
Это позволит избежать дублирования и, следовательно, займет много времени для очистки при выходе.Недостатком является то, что ваша функция теперь может неожиданно изменять ваши входные данные, потому что MATLAB не имеет возможности объявить аргумент const, как в c ++.