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