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

Experte gefragt: get()-Methode bei Erstaufruf langsam

 

Bluesmaster
Forum-Century

Forum-Century



Beiträge: 203
Anmeldedatum: 13.11.11
Wohnort: Gera
Version: 2012a
     Beitrag Verfasst am: 06.05.2012, 18:16     Titel: Experte gefragt: get()-Methode bei Erstaufruf langsam
  Antworten mit Zitat      
Ich habe ein haariges Problem, dass sich mit diesen paar Code-Zeilen
beschreiben lässt:

MATLAB NEU STARTEN!

Code:




Die get()-Methode liefert Eigenschaften grafischer Objekte zurück.
Der erstmalige Aufruf dauert aber etwa 10 x so lang wie die folgenden.

Erstmalig heißt "Anregung von Außen" z.B. bei Matlab neustart
oder bei Aufruf durch ein Callback-Event

Erster Verdacht: Das m-file das get() enthält muss neu von der Festplatte geladen werden:


before = inmem
get(0)
setdiff(before,inmem)



Fehlanzeige! Nicht funktioniert haben die Versuche:

- direkt auf grafische Eigenschaften zuzugreifen (h.CameraPosition)

- "get" in eine anonymus-Fcn zu kapseln die dauerhaft (persistent/global)
verfügbar war > anoGET = @get


Ich bin am verzweifeln, ich brauch die Info nach dem MouseMoved-Event
die Geschichte spielt im zeitkritischen Bereich.



Wer blickt so tief in Matlab dass er mir erklären kann, wie ich den Zugriff auf die "get()-fcn" gewissermaßen vorcachen kann?



Tausend Dank

Bluesmaster
Private Nachricht senden Benutzer-Profile anzeigen


Andreas Goser
Forum-Meister

Forum-Meister


Beiträge: 3.654
Anmeldedatum: 04.12.08
Wohnort: Ismaning
Version: 1.0
     Beitrag Verfasst am: 07.05.2012, 10:50     Titel:
  Antworten mit Zitat      
Mir ist klar, dass die tatsächliche Fragestellung für dieses Posting stark vereinfacht wurde. Ich denke aber, dass hier eine Beratung durch den Technischen Support bezüglich der optimalen Umsetzung sinnvoll ist.

Oftmals hilft es PCODE zu benutzen. Wobeei bei "get(0)" nichts zu erwarten ist und auch schon gar nicht wenn (wie im Beispiel) die meisten Rechenzeit bei der Command Line Ausgabe verbraucht wird.

Andreas
Private Nachricht senden Benutzer-Profile anzeigen E-Mail senden
 
Bluesmaster
Themenstarter

Forum-Century

Forum-Century



Beiträge: 203
Anmeldedatum: 13.11.11
Wohnort: Gera
Version: 2012a
     Beitrag Verfasst am: 07.05.2012, 13:07     Titel:
  Antworten mit Zitat      
Problem ist nicht die Zeit für die "get(0)-Methode" als solche sondern allein
die Tatsache dass...


der ERSTE Aufruf länger dauert als jeder WEITERE


Da landet also irgendwo irgendetwas in einem schnelleren Zwischenspeicher.
INMEM ist es nicht. Kennt jemand noch eine andere Art des Cachings in Matlab?
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: 06.06.2012, 11:15     Titel:
  Antworten mit Zitat      
Hallo Bluesmaster,

Ich verstehe das konkrete Problem nicht.
Wenn "get(0)" beim erstenmal mehr Zeit benötigt, dies aber unerwünscht ist, würde ich ein "get(0)" in startup.m einfügen, sodass es schon beim Matlab-Start den zeitaufwändigen Aufruf erledigt. Danach ist der Inhalt dann praltisch "gecached".

Ordentlicher wäre es, für Dein Programm eine eigene Initialisierungs-Routine zu schreiben, die solche Arbeiten erldedigt.

Gruß, Jan
Private Nachricht senden Benutzer-Profile anzeigen
 
Bluesmaster
Themenstarter

Forum-Century

Forum-Century



Beiträge: 203
Anmeldedatum: 13.11.11
Wohnort: Gera
Version: 2012a
     Beitrag Verfasst am: 07.06.2012, 13:39     Titel:
  Antworten mit Zitat      
Ist schon eine Weile her, danke, dass du dicht trotzdem der Thematik angenommen hast.


Ich habe startroutinen für objekt-caching aber die greifen hier nicht.
Die get()-Methode entzieht sich der "inmem"-Geschichte


Es ist schwer zu beschreiben: was die get()-Methode als "Erstaufruf" empfindet hängt vom Auslöser ab. Starte ich Matlab, so ist der Benutzer
der Auslöser, sie läuft einmal langsam dannach schnell.


Ist ein Event der Auslöser (Mouse-Moved-Event) läuft sie immer wieder langsam, sobald ein neues Maus-Event generiert wird.


Das ganze ist kein Luxus-Problem mehrere Maus-Events pro sekunde bringen mein Programm zum stocken und das ist keine Hobbyarbeit.
Vielleicht sollte ich mal Mathworks konsultieren?


Gruß

Blues
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: 08.06.2012, 00:26     Titel:
  Antworten mit Zitat      
Hallo Bluesmaster,

Wieso benötigst Du die volle Ausgabe von GET(0) für jedes MouseMoved-Event? Wäre da eine WindowsButtonMotion-Funktion nicht besser?

Kannst Du einen relevanten Code-Abschnitt posten, der das Problem reproduziert? Vielleicht kann man dann eine effizientere Methdoe vorschlagen.

Gruß, Jan
Private Nachricht senden Benutzer-Profile anzeigen
 
Sirius3
Forum-Guru

Forum-Guru


Beiträge: 441
Anmeldedatum: 11.11.11
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 08.06.2012, 07:54     Titel:
  Antworten mit Zitat      
Hallo Bluesmaster,

da get viele Properties sammelt und die Informationen zum Teil
aus Systemaufrufen erst ermitteln muß, kann das etwas dauern.
Wahrscheinlich cached Matlab das Ergebnis irgendwo, solange es sicher sein kann,
dass sich an den Werten nichts geändert hat, und erzeugt sie neu, wenn dem nicht so
ist, also bei jedem Mouse-moved-Event.

Für welches Property interessierst Du Dich wirklich?

Grüße
Sirius
Private Nachricht senden Benutzer-Profile anzeigen
 
Harald
Forum-Meister

Forum-Meister


Beiträge: 24.492
Anmeldedatum: 26.03.09
Wohnort: Nähe München
Version: ab 2017b
     Beitrag Verfasst am: 08.06.2012, 08:34     Titel:
  Antworten mit Zitat      
Hallo,

Zitat:
Das ganze ist kein Luxus-Problem mehrere Maus-Events pro sekunde bringen mein Programm zum stocken und das ist keine Hobbyarbeit.
Vielleicht sollte ich mal Mathworks konsultieren?

Das würde ich vorschlagen, ja. Vielleicht ist dort eine Lösung für dein Problem bekannt; ansonsten ist es ja immerhin gut, wenn man sich dort darüber Bescheid weiß, dass ein Anwender dieses Problem hat.

Grüße,
Harald
Private Nachricht senden Benutzer-Profile anzeigen
 
Bluesmaster
Themenstarter

Forum-Century

Forum-Century



Beiträge: 203
Anmeldedatum: 13.11.11
Wohnort: Gera
Version: 2012a
     Beitrag Verfasst am: 09.06.2012, 12:34     Titel:
  Antworten mit Zitat      
@ Jan:

Das mit der WindowButtonMotion fcn verstehe ich nicht ganz. Diese verwende ich ich doch bereits. Get(0) war nur ein Beispiel, ich brauch in Wirklichkeit
Kameradaten einer Axes > das Prinzip bleibt aber gleich.

Mein momentaner Workaround ist das aussparen einiger Mouse-Moved-Events. Aber wirklich flüssig sieht das dann auch nicht aus. Und gerade das abschneiden vor der Mausendlage bringt Asynchronität.


@sirius3

Hm die Erklärung macht Sinn insofern, als das ein Event für das Programm "von außen" kommt und es neu prüfen muss. Das bedeuted, nicht der erste Aufruf ist langsam, sondern die folgenden gewissermaßen eine Täuschung.

Das wäre natürlich eine hinzunehmende Systemimmanenz .
Ich frage demnächst mal Mathworks und berichte dann hier


Vielen Dank an alle

Gruß

Blues
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: 09.06.2012, 23:00     Titel:
  Antworten mit Zitat      
Hallo Bluesmaster,

Du benötigst gar kein "get(0)"?! Dann war Dein Beispiel irreführend. Ich habe übrigens Zeit damit vergeudet herauszufinden, welche Aufrufe get(0) an Java und das Betriebssystem weitergibt.

Bitte poste den relevanten Code. Solange nicht klar ist, wo das eigentliche Problem liegt, kann man kaum entscheiden, ob es "im Prinzip" das gleiche Problem wie bei einem beliebigen anderen Befehl ist.

Die Zeitverzögerung kann sehr viele unterschiedliche Gründe haben. So wird beim ersten Aufruf von "get(AxesHandle, 'CameraPosition') z.B. implizit ein DRAWNOW ausgeführt, so dass auch die TickMarks gefunden werden, der Renderer bestimmt wird, falls der auf "auto" steht, ein Stretch-to-fill durchgeführt um das Diagramm an die die AXES-Position anzupassen, die AXES Limits werden bestimmt, etc. Es gibt einige Methoden dies bei zeitkritischen Aufgaben zu beeinflussen. Ein Ratschlag erfordert aber natürlich, dass wir den Code sehen, und "tic; get(0); toc" ist da nicht hilfreich.

Gruß, Jan
Private Nachricht senden Benutzer-Profile anzeigen
 
Bluesmaster
Themenstarter

Forum-Century

Forum-Century



Beiträge: 203
Anmeldedatum: 13.11.11
Wohnort: Gera
Version: 2012a
     Beitrag Verfasst am: 10.06.2012, 10:13     Titel:
  Antworten mit Zitat      
Hallo Jan,

Bitte entschuldige, es lag nicht in meiner Absicht deine Zeit zu vergeuden, im Gegenteil. Ich habe selbst stundenlang gesessen
bis ich das Problem auf das meiner Meinung nach wesentliche reduziert hatte.
Für mich (als fehlbaren Menschen) hatte es den Anschein das Problem hätte etwas mit einem Cache zu tun den ich noch nicht kenne.
DH. für mich war nicht die Frage ob get(a) oder get(b) sondern warum mal schnell und mal langsam.

Ich erlebe oft Einträge die seitenlange Aufgabenstellungen erläutern und in Wirklichkeit nur an einer winzigen Stelle davon Hilfe benötigen,
dh dich wollte den Forenmitgliedern eigentlich Zeit ersparen.


Die Analyse, wie ein Befehl mit Java oder dem Betriebssystem verfährt...Wie macht man die? Welche Werkzeuge gibt es da?
Und wie kann ich schließlich darauf Einfluss nehmen?

Vielen Dank

Blues
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: 17.06.2012, 15:27     Titel:
  Antworten mit Zitat      
Hallo Bluesmaster,

Ok.
Die Geschwindigkeit von GET hängt vom Argument ab. Deshalb ist es hier von Belang, von welchem Objekt die Eigenschaften ausgelesen werden, und wie voprher auf das Objekt zugegriffen wurde.

Zitat:
Die Analyse, wie ein Befehl mit Java oder dem Betriebssystem verfährt...Wie macht man die? Welche Werkzeuge gibt es da?
Und wie kann ich schließlich darauf Einfluss nehmen?

Siehe:
Code:

License Agreement -> License Restrictions -> Abschnitte 4.1, 4.2, 4.4 und 4.5: Don't modify, adapt, reverse engineer, decompile, disassemble, publish.
Die Lizenzbedingungen verbieten also eine gründliche Erforschung der Mechanismen. Für konkrete Fragen ist der technische Support der geeignete Ansprechpartner.

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.