Как избежать экспоненциального увеличения времени Matlab при создании массива дескрипторов объекта в качестве свойства объекта

Мне кажется, что при создании массива простых дескрипторов в 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 реализует объекты, но я все еще не уверен.

9
задан Community 23 May 2017 в 12:22
поделиться