![]() |
MATLAB的垃圾收集器?
您的心理模型是什么?如何实施?它有哪些优点和缺点? MATLAB GC与Python GC
使用MATLAB嵌套函数在本来看上去很天真的代码中使用时,有时会遇到奇怪的性能瓶颈,我敢肯定这是由于GC。垃圾收集器是VM的重要组成部分,Mathworks并未将其公开。 我的问题是关于MATLAB自己的[B]堆[/B]和GC!与处理Java / COM对象无关/防止“内存不足”错误/分配堆栈变量。 [B]编辑:[/B]第一个响应实际上是元答案“我为什么要关心?”。我确实很在意,因为GC在实现[URL="https://stackoverflow.com/questions/1413860/matlab-linked-list"]链接列表[/URL]或[URL="http://en.wikipedia.org/wiki/Model%E2%80%93view%E2%80%93controller"]MVC[/URL]模式时会表现出来。 回答: 这是我收集的事实清单。在这种情况下,用[I]内存(取消)分配[/I]代替GC似乎更合适。 我的主要信息来源是Loren的博客(尤其是其评论)以及MATLAB Digest的[URL="http://www.mathworks.com/company/newsletters/digest/2008/sept/matlab-objects.html"]这篇[/URL]文章。 由于其面向具有大量数据集的数值计算,MATLAB在优化[URL="http://mathforum.org/kb/thread.jspa?threadID=265365"]堆栈对象[/URL]性能方面确实做得很好,例如[URL="http://blogs.mathworks.com/loren/2007/03/22/in-place-operations-on-data/"]对数据[/URL]使用[URL="http://blogs.mathworks.com/loren/2007/03/22/in-place-operations-on-data/"]就地操作[/URL]以及对函数参数[URL="http://blogs.mathworks.com/loren/2006/05/10/memory-management-for-functions-and-variables/"]进行按引用[/URL]调用。同样由于其定位,其内存模型与Java之类的OO语言从根本上是[URL="http://blogs.mathworks.com/loren/2008/03/04/release-r2008a-available/#comment-27674"]不同的[/URL] 。 在版本7之前,MATLAB正式没有用户定义的堆内存(在版本6中, schema.m文件中有未记录的reference功能)。 MATLAB 7具有[URL="http://www.c2.com/cgi/wiki?ClosuresAndObjectsAreEquivalent"]嵌套函数(闭包)形式和句柄对象[/URL]形式的堆,它们的实现具有相同的基础。附带说明一下,可以在MATLAB中使用闭包来[URL="http://blogs.mathworks.com/loren/2008/01/16/nested-functions-and-variable-scope/"]仿真[/URL] OO(对于2008a之前的版本很有用)。 出乎意料的是,可以检查由函数句柄(关闭)捕获的封闭函数的整个工作区,请参见MATLAB帮助中的函数[URL="http://www.mathworks.com/help/techdoc/ref/functions.html"]function(fhandle)[/URL] 。这意味着封闭的工作空间正在[I]冻结[/I]在内存中。这就是为什么在嵌套函数中使用cellfun/arrayfun有时会非常慢的原因。 [URL="http://blogs.mathworks.com/loren/2008/07/29/understanding-object-cleanup/"]Loren[/URL]和[URL="http://blogs.mathworks.com/loren/2008/03/10/keeping-things-tidy/"]Brad Phelan也有[/URL]关于对象清理的有趣文章。 在我看来,MATLAB中关于堆释放的最有趣的事实是,每次堆栈被释放时,MATLAB都会尝试执行此操作,即在离开每个函数时。这具有[URL="http://www.mathworks.com/company/newsletters/digest/2008/sept/matlab-objects.html"]优点,[/URL]但是如果堆释放缓慢,则也将带来巨大的CPU损失。在某些情况下,在MATLAB中它实际上非常慢! 可能会击中代码的MATLAB内存释放的性能问题非常严重。我总是注意到,当代码突然运行慢20倍,有时在离开函数和返回调用者之间需要花费几秒钟的时间时,我无意中在代码中引入了循环引用(花费在清理上的时间)。这是一个已知的问题,请参阅[URL="http://blogs.mathworks.com/loren/2008/08/18/when-to-create-classes-in-matlab/#comment-29947"]Dave Foti[/URL]和[URL="http://mathforum.org/kb/message.jspa?messageID=6015847&tstart=0"]此较老的论坛帖子[/URL] ,其中的代码用于使该图片可视化性能(测试是在不同的机器上进行的,因此不同MATLAB版本的绝对时序比较是没有意义的): 参考对象池大小的线性增加意味着MATLAB性能的多项式(或指数)降低!对于价值对象,其性能是线性的。 考虑到这些事实,我只能推测MATLAB尚未使用非常有效的[I]引用计数[/I]形式进行堆释放。 [B]编辑[/B] :我总是遇到[I]许多小的[/I]嵌套函数的性能问题,但是最近我注意到,至少在2006a上,清理具有数兆字节数据的[I]单个嵌套范围[/I]也是很糟糕的,仅将嵌套范围变量设置为空就需要1.5秒! [B]编辑2[/B] :终于我得到了答案- [URL="http://blogs.mathworks.com/loren/2011/03/08/common-design-considerations-for-object-properties/#comment-32092"]戴夫·福蒂本人[/URL] 。他承认这些缺陷,但表示MATLAB将保留其当前的确定性清除方法。 [B]图例:执行时间越短越好[/B] [IMG]https://i.stack.imgur.com/FUYi7.gif[/IMG][IMG]https://i.stack.imgur.com/aqvnK.gif[/IMG][IMG]https://i.stack.imgur.com/fIt4Y.gif[/IMG] [url=https://stackoverflow.com/questions/1446281]更多&回答...[/url] |
所有时间均为北京时间。现在的时间是 23:28。 |
Powered by vBulletin
版权所有 ©2000 - 2025,Jelsoft Enterprises Ltd.