我一直在编写一些MATLAB GUI(不使用GUIDE ),主要用于查看图像和其他一些简单的操作(例如选择点和从图像中绘制一些数据)。
当GUI启动时,所有操作都会快速执行。 但是,由于使用了GUI(显示了来自3D / 4D卷的不同帧并执行了上述操作),因此它开始变得越来越慢,达到了对于常见用途来说太慢的点。
我想听听一些关于:
的意见我正在使用set / getappdata将变量保存在GUI的主图中并在函数之间进行通信。
(我希望我能提供一个最小的工作示例,但我不认为它适用于这种情况,因为这只发生在更复杂的GUI中。)
非常感谢。
编辑: (使用探查器报告一些调查结果:)
我曾两次使用过探查器:
我在两个分析操作中都执行了完全相同的过程,这只是简单地在GUI周围移动鼠标(两次相同的“路径”)。
剖析器结果如下:
我在解释这些结果时遇到困难......
为什么某些函数(例如impixelinfo
)的调用次数在第二种情况下会如此之大?
有什么意见吗?
非常感谢。
答案 0 :(得分:2)
我发现围绕这个问题的最好方法是在上面暗示:强制垃圾收集。虽然在MATLAB中无法识别命令forceGarbageCollection
,但很有建议。你想要的命令是java.lang.System.gc()
......这样的野兽。
我正在开展一个项目,其中我正在以40Hz(使用计时器)和一个1000Hz的NIDAQ(使用startBackground()
)读取2个串行端口并实时绘制它们。 MATLAB的并行处理限制确保了其中一个过程在任何给定时间都会导致缓冲器阻塞。动画无法跟上,最终冻结等等。我通过确保定义单个绘图并仅使用set
命令更新动画循环内部更改的参数,获得了一些初步成功。 (例如figure, subplot(311), axis([...]),hold on, p1 = plot(x1,y1,'erasemode','xor',...);
等,然后 - &gt; tic, while (toc<8) set(p1,'xdata',x1,'ydata',y1)...
使用set
可以让您的动画更快,更流畅。但是,如果你在背景中进行了太多的动画制作,那么你仍会遇到缓冲墙 - 尤其是实时数据输入。垃圾收集是你的答案。它不是瞬间的,所以除非你的循环非常长,否则你不希望它执行每个循环周期。我的解决方案是在while循环之外设置一个计数器变量,并使用一个mod函数,这样它只能执行每一个&#39; n&#39;周期(例如counter = 0; while ()... counter++; if (~mod(counter,n)) java.lang.System.gc();
等等。
这将为您(并希望其他人)节省时间和头痛,相信我,您将拥有MATLAB执行实时数据acq和动画与LabVIEW相提并论。
答案 1 :(得分:1)
找出Matlab中为什么变慢的好策略是使用profiler。以下是使用分析器的基本方法:
profile on
% do stuff now that you want to measure
profile off
profile viewer
我建议分析一个刚刚打开的GUI,以及一个已经打开一段时间并显然很慢的GUI。然后比较结果并查找“自我时间”或“总时间”显着增加的功能,以找出导致减速的线索。