Mar*_*arc 8 matlab garbage-collection memory-management
我有一个需要很长时间才能运行的功能.当我对它进行分析时,我发现超过一半的时间(50秒中的26个)没有计入逐行时序故障,我可以证明在函数完成运行之后但在它返回控制之前花费的时间通过以下方法:
ts1 = tic;
disp ('calling function');
functionCall(args);
disp (['control returned to caller - ', num2str(toc(ts1))]);
Run Code Online (Sandbox Code Playgroud)
我调用的函数的第一行是ts2 = tic,最后一行是
disp (['last line of function- ', num2str(toc(ts2))]);
Run Code Online (Sandbox Code Playgroud)
结果是
调用功能
最后一行功能 - 24.0043
控制权返回给来电者 - 49.857
在互联网上闲聊,我认为这是MATLAB管理内存的方式的症状.它在函数返回时释放,有时这需要很长时间.该函数确实分配了一些大的(~1百万个元素)数组.它也适用于句柄,但不会显式创建任何新的句柄对象或存储句柄.我的问题是:
我发现了针对我的具体问题的解决方案,该解决方案可能普遍适用。
需要很长时间才能退出的函数是在包含句柄对象向量的基本对象上调用的。当我更改基本对象的定义以扩展句柄时,我消除了函数关闭时的滞后。
我相信发生的事情是这样的:当我将基本对象传递给我的函数时,它创建了该对象的副本(MATLAB 默认情况下按值传递)。这不会花费很多时间,但是当函数退出时,它会销毁对象副本,这导致它查看句柄对象向量以确保没有任何需要清理的孤儿。我相信正是这个操作花费了 MATLAB 很长时间。
当我更改传递给句柄的对象时,函数工作区中没有进行任何复制,因此最终不需要清理该对象。
这向我提出了一条一般规则:
如果函数在退出时需要很长时间来清理其工作区,并且您要按值传递大量数据或复杂结构,请尝试将该函数的参数封装在句柄对象中
这将避免重复,从而避免退出时耗时的清理。缺点是您的函数现在可能会意外地更改您的输入,因为 MATLAB 无法像 C++ 中那样将参数声明为 const。