MATLAB: GUI wird langsam langsamer

8

Ich habe einige MATLAB-GUIs programmiert ( nicht mit GUIDE ), hauptsächlich zum Anzeigen von Bildern und einigen anderen einfachen Operationen (z. B. Auswählen von Punkten und Zeichnen einiger Daten aus den Bildern).

Wenn die GUI startet, werden alle Operationen schnell ausgeführt. Wie auch immer, wenn die GUI benutzt wird (zeigt verschiedene Frames von 3D / 4D Volumes und führt die oben genannten Operationen aus), wird sie langsam langsamer und erreicht einen Punkt, an dem sie für die übliche Verwendung zu langsam ist.

Ich würde gerne etwas zu folgenden Themen hören:

  • Mögliche Strategien, um herauszufinden, warum die GUI langsamer wird
  • Gute MATLAB-GUI-Programmierpraktiken, um dies zu vermeiden;
  • Mögliche Referenzen, die diese Probleme beheben.

Ich verwende set / getappdata, um Variablen in der Hauptfigur der GUI zu speichern und zwischen Funktionen zu kommunizieren.

(Ich wünschte, ich könnte ein minimales funktionierendes Beispiel liefern, aber ich denke nicht, dass es in diesem Fall geeignet ist, weil dies nur in etwas komplexeren GUIs passiert.)

Vielen Dank.

BEARBEITEN: (Rückmeldung einiger Ergebnisse mit dem Profiler:)

Ich habe den Profiler zweimal benutzt:

  • sofort nach dem Start der GUI;
  • nachdem ich einige Zeit damit herumgespielt habe, bis es langsam zu langsam wurde.

Ich habe die gleiche Prozedur in beiden Profiling-Operationen durchgeführt, indem ich einfach die Maus um die GUI bewegte ( gleicher "Pfad" beide Male ).

Die Ergebnisse des Profilers lauten wie folgt:

Ich habe Schwierigkeiten, diese Ergebnisse zu interpretieren ... Warum ist die Anzahl der Aufrufe bestimmter Funktionen (zB impixelinfo ) im zweiten Fall größer?

Irgendwelche Meinungen?

Vielen Dank.

    
fnery 15.05.2013, 14:46
quelle

2 Antworten

2

Der einzige beste Weg, den ich bei diesem Problem gefunden habe, war oben angedeutet: erzwungene Speicherbereinigung. Toller Hinweis obwohl der Befehl forceGarbageCollection in MATLAB nicht erkannt wird. Der gewünschte Befehl ist java.lang.System.gc() ... so ein Biest.

Ich arbeitete an einem Projekt, bei dem ich 2 serielle Ports mit 40 Hz (mit einem Timer) und einem NIDAQ mit 1000 Hz (mit startBackground() ) gelesen und alle in Echtzeit graphisch dargestellt habe. Die parallelen Verarbeitungsgrenzen von MATLAB stellten sicher, dass einer dieser Prozesse zu jeder Zeit eine Pufferdrossel verursachte. Animationen könnten nicht Schritt halten und eventuell einfrieren, usw. Ich habe einige erste Erfolge erzielt, indem ich sichergestellt habe, dass ich ein einzelnes Diagramm definiert habe und nur Parameter ändere, die sich in meinem Animations-Loop mit dem set -Befehl geändert haben. (zB figure, subplot(311), axis([...]),hold on, p1 = plot(x1,y1,'erasemode','xor',...); usw. dann - & gt; tic, while (toc<8) set(p1,'xdata',x1,'ydata',y1)...

Die Verwendung von set wird Ihre Animationen VIEL schneller und flüssiger machen. Sie werden jedoch immer noch in die Pufferwand rennen, wenn Sie lange genug animieren und zu viel im Hintergrund laufen - insbesondere bei Echtzeit-Dateneingaben. Müllsammlung ist deine Antwort. Es ist nicht augenblicklich, also möchten Sie nicht, dass es jeden Schleifenzyklus ausführt, es sei denn, Ihre Schleife ist extrem lang. Meine Lösung besteht darin, eine Zählervariable außerhalb der while-Schleife einzurichten und eine mod-Funktion zu verwenden, so dass sie nur alle 'n' Zyklen ausführt (zB counter = 0; while ()... counter++; if (~mod(counter,n)) java.lang.System.gc(); und so weiter.

Dies wird Ihnen (und hoffentlich auch anderen) viel Zeit und Kopfzerbrechen ersparen, glauben Sie mir, und Sie werden MATLAB ausführen, das Datenakq und Animation in Echtzeit auf Augenhöhe mit LabVIEW ausführt.

    
Joseph 18.01.2015 02:37
quelle
1

Eine gute Strategie, um herauszufinden, warum in Matlab alles langsam ist, ist der Profiler . Hier ist der grundlegende Weg, um den Profiler zu verwenden:

%Vor%

Ich würde vorschlagen, ein frisch geöffnetes GUI zu erstellen, und auch eines, das seit einiger Zeit geöffnet ist und merklich langsam ist. Vergleichen Sie dann die Ergebnisse und suchen Sie nach Funktionen, die einen signifikanten Anstieg der "Eigenzeit" oder "Gesamtzeit" aufweisen, um Hinweise darauf zu erhalten, was die Verlangsamung verursacht.

    
shoelzer 15.05.2013 15:08
quelle