Низкая производительность при хранении объектов дескрипторов в массиве ячеек

У меня огромные проблемы с производительностью только с очень небольшой частью моего кода MATLAB , надеюсь, вы могли бы есть идея, как это улучшить:

Я разрабатываю моделирование на основе агентов в MATLAB, которое создает множество объектов-дескрипторов . Некоторые из них являются агентами, другие могут быть, например. объекты, принадлежащие агентам.

Чтобы четко идентифицировать каждый из этих дескрипторов , каждый получает уникальный идентификатор (obj.Id), который выдается объектом « IdDistributor ».Сам IdDistributor передается конструктору каждого объекта, который должен передать идентификатор, и вызывается оттуда для выдачи номера идентификатора ( giveId ).

Вдобавок IdDistributor хранит своего рода телефонную книгу ( IdRegistry ), которая связывает каждый идентификатор с объектом . Таким образом, по идентификатору можно найти объект в IdRegistry .

Я реализовал это, используя массив ячеек , в котором различные объекты дескрипторов хранятся именно в том поле, которое соответствует их идентификатору . (Обычный массив не работает, поскольку объекты относятся к разным классам).

При тестировании моей симуляции это очень медленно, и MATLAB Profiler показывает, что 99% времени тратится на IdDistributor , особенно на строку, которая хранит объекты в ] IdRegistry (Когда я пытался создать около 10 000 объектов, на каждый объект уходило примерно 1 секунду).

Теперь я пытаюсь найти аналогичное решение, которое занимает меньше времени . Как вы можете видеть в приведенном ниже коде, я уже пытался увеличить скорость с помощью предварительного выделения (я расширяю IdRegistry на 10 000 ячеек, когда он заполнен, вместо того, чтобы увеличивать размер 1 на 1). Я также подумал. о попытке каким-то образом получить внутренний идентификатор MATLAB объектов дескриптора, но не пошел по этому пути, когда я прочитал, что этот идентификатор не является постоянным и может быть изменен системой.

Я был бы очень признателен за любые идеи, как ускорить код или найти обходной путь / улучшение моей концепции!

Вот мой код:

Самая медленная строка - IdDist.IdRegistry (IdNumber) = {obj};

кстати. изменение его на IdDist.IdRegistry {IdNumber} = obj; мало помогло

classdef IdDistributor < handle

properties
    Id=int64(1); %Her own ID
    LastId=int64(1);
    IdRegistry={}
end

methods
    function IdDist=IdDistributor()
        IdDist.Id=int64(1);
        IdDist.LastId=int64(1);
        IdDist.register(IdDist);
    end
    function IdNum=giveId(IdDist,obj)
        IdNum=IdDist.LastId+int64(1);
        IdDist.LastId=IdNum;
        IdDist.register(obj,IdNum)
    end
    function register(IdDist,obj,IdNum)
        if nargin==2      
            IdNumber=obj.Id;
        elseif nargin==3
            IdNumber=IdNum;
        end
            if IdNumber>=length(IdDist.IdRegistry) %Extend the Register by 10000
              IdDist.IdRegistry(IdNumber+10000)={[]};    
            end
            if IdNumber >0
              IdDist.IdRegistry(IdNumber)={obj};
            end
    end %function
    end %methods
    end %class
6
задан Mat 6 October 2011 в 14:56
поделиться