Мне кажется, что при создании массива простых дескрипторов в Matlab время масштабируется примерно линейно . Однако, если я создаю точно такой же массив и сохраню его как свойство объекта, время масштабируется экспоненциально - поэтому программа становится очень медленной, когда создается много объектов.
У меня вопрос: почему это происходит и как этого можно избежать? В моем коде неправильно реализовано предварительное выделение ресурсов для свойств объекта или существует фундаментальная проблема с тем, как Matlab обрабатывает эти вещи?
Я написал простой тест, чтобы проиллюстрировать проблему:
Код простого объекта:
classdef SomeSimpleObject < handle
% SomeSimpleObject defines an Object that has one property
properties
property=0;
end
methods
function SimpleObj=SomeSimpleObject()
if nargin~=0
SimpleObj.property=1;
end
end
end
end
Использование следующего скрипта для создания массива 1x10.000 этих простых объектов занимает в соответствии с профилировщиком 0,4 sec на моей машине:
for n=10000:-1:1 % counting backwards for Memory pre-allocation
ObjectList(n)=SomeSimpleObject();
end
Однако выполнение того же самого в конструкторе класса и сохранение массива из 10 000 объектов в качестве свойства занимает 59 секунд и быстро становится намного хуже. Попробуйте это, создав объект из этого класса (например, a = HostingObject )
classdef HostingObject < handle
% This Objects Hosts a List of Objects that are created in the
% constructor
properties
ObjectList=SomeSimpleObject
end
methods
function obj=HostingObject()
for n=10000:-1:1 % counting backwards for Memory pre-allocation
obj.ObjectList(n)=SomeSimpleObject();
end
end
end
end
В поисках ответа Я наткнулся на обсуждение распределения памяти в Matlab и сборки мусора . Ответ Михаила (также не имеющий прямого отношения к моему вопросу) заставил меня подумать, что это может быть фундаментальная проблема с тем, как Matlab реализует объекты, но я все еще не уверен.