У меня огромные проблемы с производительностью только с очень небольшой частью моего кода 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