Вдохновленный ответами @ Jonas Heidelberg и @ Tobias Heß Я придумал следующее решение , которое вообще не нуждается в массивах .Объекты хранятся во вспомогательном массиве, и по завершении они копируются в массив свойств:
Код для HostingObject с массивом «post-selection»:
classdef JacobHostingObject < handle
% This Objects Hosts a List of Objects that are created in the constructor
properties
ObjectList=SomeSimpleObject
end
methods
function obj=JacobHostingObject()
for n=10000:-1:1 % counting backwards for Memory pre-allocation
a(n)=SomeSimpleObject(); % auxiliary array for "post-allocation"
end
obj.ObjectList=a; % "post-allocation"
end
end
end
Итак, как работают три решения (Джонас, Тобиас и мое)?
Я провел несколько тестов (с MATLAB R2011b 64bit), чтобы сравнить их:
10.000 объектов
Истекшее время: Тобиас: 0,30 сек ;Джейкоб: 0,31 с;Йонас: 2,02 с;Оригинал: 56,79 с
100 000 Объектов
Истекшее время: Тобиас: 2,42 с ;Джейкоб: 2,95 с;Джонас: 203,03 с
1 000 000 Объектов
Истекшее время: Тобиас: 23,84 с ;Джейкоб: 29,18 с
Похоже, версия Tobias - самое быстрое решение
Интересно отметить, что решение Jonas намного лучше, чем оригинал, номасштабируется гораздо хуже двух других решений.Это подтверждает наблюдение, которое я сделал в своем предыдущем вопросе «низкая производительность при хранении объектов-дескрипторов в массиве ячеек» .Немного иронично, что использование техники, которая была причиной моей более ранней проблемы, оказывается улучшением этой проблемы.Тем не менее, решение Tobias даже отвечает и на мой старый вопрос (я опубликую там ссылку).
Однако до сих пор не ясно, что на самом деле происходит внутри MATLAB, что вызывает различия в производительности .Может быть полезно понять это, чтобы не столкнуться с подобными проблемами в будущем!