8

我一直在编写一些 MATLAB GUI(不使用 GUIDE),主要用于查看图像和一些其他简单的操作(例如选择点和从图像中绘制一些数据)。

当 GUI 启动时,所有操作都会快速执行。然而,随着 GUI 的使用(显示来自 3D/4D 体积的不同帧并执行上述操作),它开始逐渐变慢,达到一个对于普通使用来说太慢的程度。

我想听听一些关于:

  • 找出GUI 变慢原因的可能策略;
  • 避免这种情况的良好 MATLAB GUI 编程实践;
  • 解决这些问题的可能参考资料。

我正在使用 set/getappdata 将变量保存在 GUI 的主图中并在函数之间进行通信。

(我希望我能提供一个最小的工作示例,但我认为它不适合这种情况,因为这只发生在稍微更复杂的 GUI 中。)

非常感谢。

编辑:( 使用探查器报告一些发现:)

我在两种情况下使用了探查器:

  • 启动 GUI 后立即;
  • 在玩了一段时间之后,直到它开始变得太慢。

我在两个分析操作中执行了完全相同的过程,这只是简单地在 GUI 周围移动鼠标(两次相同的“路径”)。

探查器结果如下:

在此处输入图像描述

impixelinfo我在解释这些结果时遇到了困难......为什么在第二种情况下某些函数(例如)的调用次数如此之大?

有什么意见吗?

非常感谢。

4

2 回答 2

2

上面暗示了我发现的解决此问题的唯一最佳方法:强制垃圾收集。尽管该命令forceGarbageCollection在 MATLAB 中无法识别,但建议很好。你想要的命令是java.lang.System.gc()……这样的野兽。

我正在做一个项目,其中我正在读取 2 个 40Hz 的串行端口(使用计时器)和一个 1000Hz 的 NIDAQ(使用startBackground())并实时绘制它们。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();等等。

这将为您(以及希望其他人)节省大量时间和头痛,相信我,您将让 MATLAB 执行与 LabVIEW 相媲美的实时数据采集和动画。

于 2015-01-18T02:37:25.677 回答
1

找出为什么在 Matlab 中运行缓慢的一个好策略是使用分析器。以下是使用分析器的基本方法:

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

我建议分析一个新打开的 GUI,以及一个已经打开一段时间并且速度明显缓慢的 GUI。然后比较结果并寻找“自我时间”或“总时间”显着增加的函数,以寻找导致减速的线索。

于 2013-05-15T15:08:12.693 回答