在我看来,在Matlab中创建一个简单的句柄对象数组的时间尺度大约是线性的.但是,如果我创建完全相同的数组并将其存储为对象的属性,则时间会呈指数级增长 – 因此在创建许多对象时程序会变得非常慢.
我的问题是为什么会发生这种情况以及如何避免这种情况?
对象属性的预分配是否在我的代码中没有正确实现,或者Matlab处理这些事情的方式是否存在根本问题?
我写了一个简单的测试来说明这个问题:
简单对象代码:
classdef SomeSimpleObject < handle
% SomeSimpleObject defines an Object that has one property
properties
property=0;
end
methods
function SimpleObj=SomeSimpleObject()
if nargin~=0
SimpleObj.property=1;
end
end
end
end
使用以下脚本创建这些简单对象的1×10.000数组根据我的机器上的分析器0,4秒:
for n=10000:-1:1 % counting backwards for Memory pre-allocation
ObjectList(n)=SomeSimpleObject();
end
但是,在类构造函数中执行相同的操作并将10.000个对象的数组存储为属性需要59秒,并且它会更快地变得更糟.通过从这个类创建一个对象来尝试它(例如a = HostingObject)
classdef HostingObject < handle
% This Objects Hosts a List of Objects that are created in the
% constructor
properties
ObjectList=SomeSimpleObject
end
methods
function obj=HostingObject()
for n=10000:-1:1 % counting backwards for Memory pre-allocation
obj.ObjectList(n)=SomeSimpleObject();
end
end
end
end
寻找答案我遇到了关于Matlab内存分配和garbage collection的讨论.Mikhail的答案(也与我的问题没有直接关系)让我觉得它可能是Matlab实现对象的方式的根本问题,但我是还是不确定.