Labfans是一个针对大学生、工程师和科研工作者的技术社区。 论坛首页 | 联系我们(Contact Us)
MATLAB爱好者论坛-LabFans.com
返回   MATLAB爱好者论坛-LabFans.com > 其它 > 资料存档
资料存档 资料存档
回复
 
主题工具 显示模式
旧 2019-12-10, 16:49   #1
poster
高级会员
 
注册日期: 2019-11-21
帖子: 3,006
声望力: 66
poster 正向着好的方向发展
帖子 MATLAB的垃圾收集器?

您的心理模型是什么?如何实施?它有哪些优点和缺点? MATLAB GC与Python GC

使用MATLAB嵌套函数在本来看上去很天真的代码中使用时,有时会遇到奇怪的性能瓶颈,我敢肯定这是由于GC。垃圾收集器是VM的重要组成部分,Mathworks并未将其公开。

我的问题是关于MATLAB自己的和GC!与处理Java / COM对象无关/防止“内存不足”错误/分配堆栈变量。

编辑:第一个响应实际上是元答案“我为什么要关心?”。我确实很在意,因为GC在实现链接列表MVC模式时会表现出来。


回答:
这是我收集的事实清单。在这种情况下,用内存(取消)分配代替GC似乎更合适。

我的主要信息来源是Loren的博客(尤其是其评论)以及MATLAB Digest的这篇文章。

由于其面向具有大量数据集的数值计算,MATLAB在优化堆栈对象性能方面确实做得很好,例如对数据使用就地操作以及对函数参数进行按引用调用。同样由于其定位,其内存模型与Java之类的OO语言从根本上是不同的

在版本7之前,MATLAB正式没有用户定义的堆内存(在版本6中, schema.m文件中有未记录的reference功能)。 MATLAB 7具有嵌套函数(闭包)形式和句柄对象形式的堆,它们的实现具有相同的基础。附带说明一下,可以在MATLAB中使用闭包来仿真 OO(对于2008a之前的版本很有用)。

出乎意料的是,可以检查由函数句柄(关闭)捕获的封闭函数的整个工作区,请参见MATLAB帮助中的函数function(fhandle) 。这意味着封闭的工作空间正在冻结在内存中。这就是为什么在嵌套函数中使用cellfun/arrayfun有时会非常慢的原因。

LorenBrad Phelan也有关于对象清理的有趣文章。

在我看来,MATLAB中关于堆释放的最有趣的事实是,每次堆栈被释放时,MATLAB都会尝试执行此操作,即在离开每个函数时。这具有优点,但是如果堆释放缓慢,则也将带来巨大的CPU损失。在某些情况下,在MATLAB中它实际上非常慢!

可能会击中代码的MATLAB内存释放的性能问题非常严重。我总是注意到,当代码突然运行慢20倍,有时在离开函数和返回调用者之间需要花费几秒钟的时间时,我无意中在代码中引入了循环引用(花费在清理上的时间)。这是一个已知的问题,请参阅Dave Foti此较老的论坛帖子 ,其中的代码用于使该图片可视化性能(测试是在不同的机器上进行的,因此不同MATLAB版本的绝对时序比较是没有意义的):

参考对象池大小的线性增加意味着MATLAB性能的多项式(或指数)降低!对于价值对象,其性能是线性的。

考虑到这些事实,我只能推测MATLAB尚未使用非常有效的引用计数形式进行堆释放。

编辑 :我总是遇到许多小的嵌套函数的性能问题,但是最近我注意到,至少在2006a上,清理具有数兆字节数据的单个嵌套范围也是很糟糕的,仅将嵌套范围变量设置为空就需要1.5秒!

编辑2 :终于我得到了答案- 戴夫·福蒂本人 。他承认这些缺陷,但表示MATLAB将保留其当前的确定性清除方法。

图例:执行时间越短越好





更多&回答...
poster 当前离线   回复时引用此帖
回复


发帖规则
不可以发表新主题
不可以发表回复
不可以上传附件
不可以编辑自己的帖子

启用 BB 代码
论坛禁用 表情符号
论坛启用 [IMG] 代码
论坛启用 HTML 代码



所有时间均为北京时间。现在的时间是 19:48


Powered by vBulletin
版权所有 ©2000 - 2025,Jelsoft Enterprises Ltd.