1

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

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

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

我尝试清除、删除和覆盖旧的模拟对象,但没有发现性能上有显着差异。

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

4

2 回答 2

1

如果没有看到它,或者至少是一些高级设计,很难说出任何关于你的代码的特别之处。

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

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

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

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

于 2012-09-11T08:35:07.017 回答
0

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

一种解决方法是使用临时局部变量来操作元胞数组,然后将此 tmp 变量分配回您的句柄对象属性。在一种情况下,我看到性能提高了约 100 倍。

于 2012-10-25T18:42:30.030 回答