Низкая производительность при хранении объектов дескриптора в массиве ячеек - PullRequest
6 голосов
/ 06 октября 2011

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

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

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

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

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

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

Теперь япытаюсь найти аналогичное решение, которое занимает меньше времени .Как вы можете видеть из приведенного ниже кода, я уже пытался увеличить скорость с предварительным распределением (я увеличиваю 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

Ответы [ 2 ]

2 голосов
/ 07 октября 2011

Поскольку вы не удаляете объекты из своего реестра, вы можете попробовать извлечь все ваши объекты из класса matlab.mixin.Heterogene , а затем сохранить их как обычный массив.Обратите внимание, что для этого потребуется R2011a или новее.

Я не знаю, быстрее ли это, но стоит попробовать.Конечно, это будет полезно, только если все ваши идентификаторы сгенерированы IdDistributor, поскольку они последовательные.

Кроме того, мои тесты показывают, что

length(IdDist.IdRegistry)

также медленный, поэтомуВы также можете хранить длину реестра в IdDistributor.и я бы предложил установить SetAccess в protected для свойств, для безопасности.

0 голосов
/ 11 октября 2011

Я дополнительно изучил проблему, и мне кажется, что на самом деле большая часть времени теряется в процессе вызова метода giveId IdDistributer из другого объекта, а не внутри метода.

Я также определил другие места в моей программе, где возникают подобные проблемы. Особенно, когда многие объекты-дескрипторы создаются и хранятся в массиве, и этот массив хранится как свойство объекта. Поэтому первоначальная причина низкой производительности может заключаться в этом, поскольку IdDistributer обычно используется при создании новых объектов дескриптора.

Так как это несколько другая тема, я опубликовал еще один вопрос , включая простой код для иллюстрации.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...