gpt4 book ai didi

performance - MATLAB:GUI 逐渐变慢

转载 作者:太空宇宙 更新时间:2023-11-03 19:25:21 25 4
gpt4 key购买 nike

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

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

我想听听一些关于:

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

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

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

非常感谢。

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

我在两个场合使用了分析器:

  • 启动 GUI 后立即;
  • 试用了一段时间后,它开始变得太慢了。

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

分析器结果如下:

enter image description here

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

有什么意见吗?

非常感谢。

最佳答案

上面暗示了我找到的解决此问题的唯一最佳方法:强制垃圾收集。通过命令 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 同等的实时数据采集和动画。

关于performance - MATLAB:GUI 逐渐变慢,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16568210/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com