在MATLAB中缓慢删除句柄对象

时间:2012-09-11 08:29:38

标签: oop matlab lifecycle

我使用MATLAB编写模拟引擎,用于模拟生产环境中的产品流。我从句柄继承了所有使用过的类,并使用这些句柄(我猜是非常过分)来链接,例如产品和工作系统,订单等。

现在,为了运行我的模型的多个实例,我创建了一个包含所有其他对象及其关系的模拟对象,运行模型并释放模拟变量。

创建和运行模型需要大约50秒(这包括生成所有对象,它们之间的关系,当然还有模拟运行过程中的计算)。在下次运行之前释放变量,目前需要约3-4分钟!

我尝试清除,删除和简单覆盖旧的模拟对象,而没有通知性能上的显着差异。

有没有办法在不重写代码的情况下提高性能?

2 个答案:

答案 0 :(得分:1)

如果没有看到它,或者至少是一些高级设计,很难说出你的代码。

在优化OO方面之前的简短建议:  您确定瓶颈在于创建对象吗?使用分析器验证它。

如果OO确实是瓶颈,这里有一些猜测:

  1. 您使用了循环引用。 Matlab不使用垃圾收集器,而是使用智能引用计数机制,在这种情况下可能会非常慢。将对象之间的引用更改为树状。

  2. 您创建了大量对象。 Matlab对每个对象都有很大的开销,远远超过传统语言(c ++,java)。重新设计系统以减少对象的数量。

答案 1 :(得分:0)

您是否碰巧使用单元格数组来存储句柄对象中的其他句柄对象?在Matlab R2011A之前,这可能会导致严重的减速。见http://www.mathworks.com/support/solutions/en/data/1-6VVMS0/index.html?product=ML

解决方法是使用临时局部变量来操作单元格数组,然后将此tmp变量分配回句柄对象属性。在一个案例中,我看到了大约100倍的性能提升。