MATLAB:GUI逐渐变慢

8
我一直在编写一些MATLAB GUI(不使用GUIDE),主要用于查看图像和一些其他简单操作(如选择点并从图像中绘制一些数据)。
当GUI启动时,所有操作都会快速执行。但是,随着GUI的使用(显示来自3D / 4D体积的不同帧并执行上述操作),它开始逐渐变慢,达到了对普通使用者来说太慢的程度。
我想听听以下方面的意见:
  • 找出GUI为什么变慢的可能策略;
  • 良好的MATLAB GUI编程实践以避免这种情况;
  • 可能涉及这些问题的参考资料。
我正在使用set/getappdata在GUI的主要图形中保存变量并在函数之间进行通信。
(我希望我能提供一个最小的工作示例,但我认为在这种情况下不合适,因为这只发生在相对复杂的GUI中。)
非常感谢。 编辑: (使用分析器报告一些结果:) 我在两个场合使用了分析器:
  • GUI启动后立即;
  • 玩了一段时间之后,直到它开始变得太慢。
我在两个分析操作中执行了完全相同的过程,即在GUI周围移动鼠标(两次都是相同的“路径”)。
分析器结果如下: enter image description here 我很难解释这些结果...为什么在第二种情况下某些函数(例如impixelinfo)的调用次数要多得多?
有什么看法吗?
非常感谢。

试一下这个:forceGarbageCollection()。这是与Java相关的东西。 - huseyin tugrul buyukisik
1
你是否尝试在长时间运行GUI时监控内存使用情况?它通常非常高吗?或者例如随着GUI变慢而逐渐增加?你是只使用MATLAB,还是在任何地方调用Java或MEXed C代码?你是使用常规MATLAB变量,还是使用对象 - 如果是,它们是值类对象还是句柄类对象? - Sam Roberts
@SamRoberts:没有,我还没有尝试在运行GUI时监视内存使用情况。我会尝试并回报结果。关于其他问题,我只是使用MATLAB和普通变量。谢谢。 - fnery
1
关于分析器结果...在这些函数内设置断点,然后再次运行GUI以找出为什么它们被调用了那么多次。也许你正在做一些像添加新轴或数据但从未删除旧轴的事情。 - shoelzer
正如@shoelzer所提到的,确保您只是更新图形数据,而不是在GUI中一遍又一遍地添加它们。 - Hoki
嗨...我猜你可能已经解决了这个问题 - 因为那是一段时间以前的事情了,但最近我遇到了类似的问题,并且刚刚发现impixelinfo可能是原因。我认为即使你按照@Hoki的建议使用数据更新绘图,如果随后使用impixelinfo,它可能会导致大量的impixelinfo工具副本堵塞事件队列。 - JPH
2个回答

2
我找到了一个解决这个问题的最佳方法:强制垃圾回收。虽然MATLAB不支持forceGarbageCollection命令,但你需要的命令是java.lang.System.gc()...它很厉害。
我曾经在一个项目中使用定时器以40Hz读取两个串口和使用startBackground()以1000Hz读取一个NIDAQ,并实时显示它们的图形。 MATLAB的并行处理限制保证了这些进程中的一个会在任何时候导致缓冲区阻塞。动画将无法跟上并最终冻结等。首先要确保定义一个单一图形,并只在动画循环内更新改变的参数,使用set命令。(例如 figure, subplot(311), axis([...]),hold on, p1 = plot(x1,y1,'erasemode','xor',...); 等等,然后-->>tic, while (toc<8) set(p1,'xdata',x1,'ydata',y1)...)
使用set会使动画更加快速流畅。但是如果您使用太多后台程序并且进行足够长时间的动画,仍然会遇到缓冲区阻塞的问题,特别是在实时数据输入时。垃圾回收是解决方案。它不是即时执行的,因此您不希望每个循环周期都执行它,除非您的循环极长。我的解决方案是在while循环外设置一个计数器变量,并使用mod函数使其仅在每n个周期(例如counter = 0; while ()... counter++; if (~mod(counter,n)) java.lang.System.gc(); 等等) 执行一次。
这将为你(以及其他人)节省大量时间和头痛,相信我,你将可以以与LabVIEW相同的速度执行实时数据采集和动画操作。

1

查找Matlab中任何缓慢的原因的好策略是使用profiler。以下是使用分析器的基本方法:

profile on
% do stuff now that you want to measure
profile off
profile viewer

我建议对新打开的GUI以及已经打开一段时间且明显缓慢的GUI进行分析。然后比较结果,寻找"Self Time"或"Total Time"显著增加的功能,以便确定导致减速的原因。

我经常使用分析器来分析常规脚本,但在GUI中使用它有点让我困惑,因为用户自己可能会花费大量时间而不是我们感兴趣的代码。这难道不会使计时变得不太精确吗? - fnery
@fnery 我认为所有的空闲时间(等待用户输入)都将与某个顶层函数关联,而你可能并不关心。你仍然会获得关于低级函数的良好信息,其中问题很可能发生。 - shoelzer
2
从MATLAB Central找到了一些关于这个问题的有用链接:链接1链接2 - fnery

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接