WICHTIG: Der Betrieb von goMatlab.de wird privat finanziert fortgesetzt. - Mehr Infos...

Mein MATLAB Forum - goMatlab.de

Mein MATLAB Forum

 
Gast > Registrieren       Autologin?   

Partner:




Forum
      Option
[Erweitert]
  • Diese Seite per Mail weiterempfehlen
     


Gehe zu:  
Neues Thema eröffnen Neue Antwort erstellen

GUI mehrere Plots - extrem langsam

 

Cabernet
Forum-Newbie

Forum-Newbie


Beiträge: 4
Anmeldedatum: 06.04.13
Wohnort: ---
Version: R2011b
     Beitrag Verfasst am: 15.06.2015, 15:56     Titel: GUI mehrere Plots - extrem langsam
  Antworten mit Zitat      
Hallo,

ich habe vor kurzem ein Programm geschrieben, welches dazu dient eine Datenaufzeichnung einzulesen und grafisch darzustellen.
Zum einen habe ich einen GPS Plot, welcher ansicher superfunktioniert.
Dazu noch aktuell vier weitere Plots, welche verschiedene Kanäle darstellen.

Als x-Achse dient in den Plots die aktuelle Messzeit aus der Datenaufzeichnung. Um die Messung komfortabel "durchzusehen" benutze ich eine Slider Bar.
Außerdem auch eine Play/Stop Taste, bei welcher bei jedem Schleifendurchlauf die aktuelle Zeit um beispielsweise 1/10s erhöht wird.
Letzteres ist aber für mein Problem erstmal nebensächlich.

Zum Problem:
Schon wenn ich nur die Zeit auf einen anderen Messwert ändere und dementsprechend die vier Plots mit neuen Achsenlimits gezeichnet werden, muss ich teilweise bis zu 3 Sekunden warten, bis wieder alles fertig geplottet ist!!

Zum Grundlegenden Prinzip:
Bei einer Änderung des Zeitwertes werden für jeden Plot die Achsenlimits neu gesetzt. Weiter nichts. Die Messdaten (y-Achse) werden schon im vorherein eingelesen. Dadurch konnte ich schon etwas Zeit sparen.

Anfangs habe ich die Achsenlimits auch über axis(xx yy) geändert. Da war es auch schon sehr langsam.
Dann habe ich auf set(gca,'XLim',...) gewechselt, dann war es etwas schneller. Aber immer noch so langsam, dass das Programm im Grunde unbrauchbar ist.

Matlab R2013a 64bit.


Laut Profile ist für die lange "Wartedauer" nur die Rescale Unterfunktion verantwortlich. Mit knapp drei Sekunden pro Aufruf. (Siehe Anhang) Diese dient nur dazu die Achsenlimits neu zu setzen:
Code:
function rescale_test(handles)
global Time_Value
allAxesInFigure = findall(gcf,'type','axes');
delete(findobj(allAxesInFigure,'Type','line','Color','k'));  


axes(handles.axes2);
set(gca,'XLim',[Time_Value-100 Time_Value+100]);

axes(handles.axes3);
set(gca,'XLim',[Time_Value-100 Time_Value+100]);

axes(handles.axes4);
set(gca,'XLim',[Time_Value-100 Time_Value+100]);

axes(handles.axes5);
set(gca,'XLim',[Time_Value-100 Time_Value+100]);    


(Der erste Teil dient nur dazu vorhandene Linien zu entfernen. Eigentlich wird bei jedem Aufruf der Funktion auch eine neue Linie beim aktuellen Time_Value gezeichnet, damit man weiß wo man sich befindet. Habe ich mal testweise entfernt, hat nichts gebracht. )


Gibt es hier irgendwelche Grundregeln um die Darstellung zu beschleunigen?

Warum sind die Plots so langsam? Was könnte ich verbessern?

Oder ist Matlab für diese Zwecke einfach ungeeignet?

Am Computer sollte es nicht legen, habe extra Arbeitsspeicher und CPU Belastung im Auge behalten. Da tut sich nichts wenn ich das Programm ausführe.

Unbenannt-2.jpg
 Beschreibung:
profiler

Download
 Dateiname:  Unbenannt-2.jpg
 Dateigröße:  119.12 KB
 Heruntergeladen:  388 mal
Unbenannt-1.jpg
 Beschreibung:
GUI

Download
 Dateiname:  Unbenannt-1.jpg
 Dateigröße:  157.67 KB
 Heruntergeladen:  368 mal
Private Nachricht senden Benutzer-Profile anzeigen


Winkow
Moderator

Moderator



Beiträge: 3.842
Anmeldedatum: 04.11.11
Wohnort: Dresden
Version: R2014a 2015a
     Beitrag Verfasst am: 15.06.2015, 16:16     Titel:
  Antworten mit Zitat      
und was dauert in der rescale_test am längsten?
_________________

richtig Fragen
Private Nachricht senden Benutzer-Profile anzeigen
 
Cabernet
Themenstarter

Forum-Newbie

Forum-Newbie


Beiträge: 4
Anmeldedatum: 06.04.13
Wohnort: ---
Version: R2011b
     Beitrag Verfasst am: 15.06.2015, 16:26     Titel:
  Antworten mit Zitat      
ah gut, wusste gar nicht, dass man da noch genauer nachschauen kann Very Happy

Es liegt am
"axes(handles.axes2);"
bzw das gleiche für axes3, axes4, axes5

(Genaueres siehe Anhang)


bzw. folgendes war auch noch sehr langsam. Hatte das jetzt erstmal testweise entfernt: "allAxesInFigure = findall(gcf,'type','axes')"

Nebenbei: Ich habe jetzt noch vor jeder neuen Änderung der jeweiligen Achsenlimits folgendes eingefügt:
"set(gca,'DrawMode','fast')"
Jetzt dauert es immerhin schon nur noch halb so lange. Aber immer noch zu lang!

detail.jpg
 Beschreibung:

Download
 Dateiname:  detail.jpg
 Dateigröße:  50.87 KB
 Heruntergeladen:  373 mal
Private Nachricht senden Benutzer-Profile anzeigen
 
Winkow
Moderator

Moderator



Beiträge: 3.842
Anmeldedatum: 04.11.11
Wohnort: Dresden
Version: R2014a 2015a
     Beitrag Verfasst am: 15.06.2015, 16:57     Titel:
  Antworten mit Zitat      
warum benutzt du axes(h) und gca und nicht gleich nur das axes handle ?
_________________

richtig Fragen
Private Nachricht senden Benutzer-Profile anzeigen
 
Cabernet
Themenstarter

Forum-Newbie

Forum-Newbie


Beiträge: 4
Anmeldedatum: 06.04.13
Wohnort: ---
Version: R2011b
     Beitrag Verfasst am: 15.06.2015, 19:45     Titel:
  Antworten mit Zitat      
Vielen Dank für die Hilfe!

habe es jetzt mal so umgesetzt wie du vorgeschlagen hast und es hat tatsächlich funktioniert. Wenn ich direkt auf das handle zugegriffen habe, ohne "axes(handlex.axesX)" dann geht es wesentlich schneller.

bzw inzwischen habe ich es noch ein bisschen weiter modifiziert und mache es jetzt über Subplots, die ich in der openingfcn definiere:
ax1=subplot(4,1,1);
ax2=subplot(4,1,2);
ax3=subplot(4,1,3);
ax4=subplot(4,1,4);
All_Axes=[ax1 ax2 ax3 ax4];

Und dann erst später nachdem ein neuer "Time_Value" über die SlideBar erzeugt wurde:
set(All_Axes,'XLim',[Time_Value-100 Time_Value+100]);

Jetzt bekomme ich für die Rescale Funktion nur noch knapp 2ms anstatt 3s wie davor.
Laut Profiler.
In echt ist aber immer noch eine kurze Verzögerung von geschätzt 1s vorhanden. Im Profiler ist nichts zu sehen.

Für die Analyse der Messdaten gibt es auch ein offizielles Programm (Java), da geht das wesentlich besser. Da gibt es auch eine SlideBar und der Bereich verschiebt sich quasi ohne Verzögerung.
Nur das ist mir von der Funktionalität zu eingeschränkt.

neu_profiler.jpg
 Beschreibung:

Download
 Dateiname:  neu_profiler.jpg
 Dateigröße:  238.48 KB
 Heruntergeladen:  421 mal
Private Nachricht senden Benutzer-Profile anzeigen
 
Jan S
Moderator

Moderator


Beiträge: 11.057
Anmeldedatum: 08.07.10
Wohnort: Heidelberg
Version: 2009a, 2016b
     Beitrag Verfasst am: 23.06.2015, 11:47     Titel:
  Antworten mit Zitat      
Hallo Cabernet,

Ohne den relevanten Code zu sehen, kann man nur schwer Verbesserungsvorschläge geben.

Es ist merkwürdig, dass GUIDATA und isprop so viel Zeit benötigen. Falls die AXES Linien mit sehr vielen Zahlen enthalten, ist das automatische Setzen der Y-Werte zeitraubend. YLim hier hart zu setzen wäre eine Idee.

Gruß, Jan
Private Nachricht senden Benutzer-Profile anzeigen
 
Neues Thema eröffnen Neue Antwort erstellen



Einstellungen und Berechtigungen
Beiträge der letzten Zeit anzeigen:

Du kannst Beiträge in dieses Forum schreiben.
Du kannst auf Beiträge in diesem Forum antworten.
Du kannst deine Beiträge in diesem Forum nicht bearbeiten.
Du kannst deine Beiträge in diesem Forum nicht löschen.
Du kannst an Umfragen in diesem Forum nicht mitmachen.
Du kannst Dateien in diesem Forum posten
Du kannst Dateien in diesem Forum herunterladen
.





 Impressum  | Nutzungsbedingungen  | Datenschutz | FAQ | goMatlab RSS Button RSS

Hosted by:


Copyright © 2007 - 2024 goMatlab.de | Dies ist keine offizielle Website der Firma The Mathworks

MATLAB, Simulink, Stateflow, Handle Graphics, Real-Time Workshop, SimBiology, SimHydraulics, SimEvents, and xPC TargetBox are registered trademarks and The MathWorks, the L-shaped membrane logo, and Embedded MATLAB are trademarks of The MathWorks, Inc.