我的功能需要很长时间才能运行。当我对其进行分析时,发现在逐行计时故障中并没有考虑超过一半的时间(50秒中的26秒),并且我可以证明该时间是在函数完成运行之后但在返回控制之前所花费的时间通过以下方法:
ts1 = tic; disp ('calling function'); functionCall(args); disp (['control returned to caller - ', num2str(toc(ts1))]); 我调用的函数的第一行是ts2 = tic ,最后一行是
disp (['last line of function- ', num2str(toc(ts2))]); 结果是
调用功能
最后一行功能-24.0043
控制权返回给呼叫者-49.857
在互联网上闲逛,我认为这是MATLAB管理内存方式的一种征兆。它在函数返回时取消分配,有时会花费很长时间。该函数确实分配了一些大数组(约100万个元素)。它也适用于句柄,但不会创建任何新的句柄对象或显式存储句柄。我的问题是:
- 这肯定是内存管理问题吗?
- 与快速返回的其他功能相比,有没有系统的方法来诊断导致此功能出现问题的原因?
- 是否有一些通用的技巧可以减少MATLAB在函数出口清理上花费的时间?
回答:
我发现了针对我的特定问题的修复程序,该修复程序通常可以适用。
花费很长时间退出的函数在包含对象对象向量的基本对象上调用。当我更改基本对象的定义以扩展句柄时,消除了函数关闭的滞后。
我相信发生的事情是这样的:当我将基本对象传递给函数时,它创建了该对象的副本(默认情况下,MATLAB通过值传递)。这并不需要花费很多时间,但是当函数退出时,它销毁了对象副本,这导致它查看了句柄对象的向量,以确保没有任何需要清除的孤儿。我相信正是这种操作使MATLAB花费了很长时间。
当我更改要传递给句柄的对象时,在函数工作区中没有进行任何复制,因此最后无需清理对象。
这向我建议了一条一般规则:
如果函数在退出时花费很长时间来清理其工作空间,并且您要通过值传递大量数据或复杂结构,请尝试将该函数的参数封装在句柄对象中
这样可以避免重复操作,从而避免在退出时浪费时间。缺点是您的函数现在可以意外更改您的输入,因为MATLAB不像c ++那样具有声明参数const的能力。
更多&回答...