|
|
Experte gefragt: get()-Methode bei Erstaufruf langsam |
|
Bluesmaster |
Forum-Century
|
|
Beiträge: 203
|
|
|
|
Anmeldedatum: 13.11.11
|
|
|
|
Wohnort: Gera
|
|
|
|
Version: 2012a
|
|
|
|
|
|
Verfasst am: 06.05.2012, 18:16
Titel: Experte gefragt: get()-Methode bei Erstaufruf langsam
|
|
|
|
|
Ich habe ein haariges Problem, dass sich mit diesen paar Code-Zeilen
beschreiben lässt:
MATLAB NEU STARTEN!
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
|
|
|
|
|
Andreas Goser |
Forum-Meister
|
|
Beiträge: 3.654
|
|
|
|
Anmeldedatum: 04.12.08
|
|
|
|
Wohnort: Ismaning
|
|
|
|
Version: 1.0
|
|
|
|
|
|
Verfasst am: 07.05.2012, 10:50
Titel:
|
|
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
|
|
|
Bluesmaster |
Themenstarter
Forum-Century
|
|
Beiträge: 203
|
|
|
|
Anmeldedatum: 13.11.11
|
|
|
|
Wohnort: Gera
|
|
|
|
Version: 2012a
|
|
|
|
|
|
Verfasst am: 07.05.2012, 13:07
Titel:
|
|
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?
|
|
|
Jan S |
Moderator
|
|
Beiträge: 11.057
|
|
|
|
Anmeldedatum: 08.07.10
|
|
|
|
Wohnort: Heidelberg
|
|
|
|
Version: 2009a, 2016b
|
|
|
|
|
|
Verfasst am: 06.06.2012, 11:15
Titel:
|
|
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
|
|
|
Bluesmaster |
Themenstarter
Forum-Century
|
|
Beiträge: 203
|
|
|
|
Anmeldedatum: 13.11.11
|
|
|
|
Wohnort: Gera
|
|
|
|
Version: 2012a
|
|
|
|
|
|
Verfasst am: 07.06.2012, 13:39
Titel:
|
|
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
|
|
|
Jan S |
Moderator
|
|
Beiträge: 11.057
|
|
|
|
Anmeldedatum: 08.07.10
|
|
|
|
Wohnort: Heidelberg
|
|
|
|
Version: 2009a, 2016b
|
|
|
|
|
|
Verfasst am: 08.06.2012, 00:26
Titel:
|
|
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
|
|
|
Sirius3 |
Forum-Guru
|
|
Beiträge: 441
|
|
|
|
Anmeldedatum: 11.11.11
|
|
|
|
Wohnort: ---
|
|
|
|
Version: ---
|
|
|
|
|
|
Verfasst am: 08.06.2012, 07:54
Titel:
|
|
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
|
|
|
Harald |
Forum-Meister
|
|
Beiträge: 24.495
|
|
|
|
Anmeldedatum: 26.03.09
|
|
|
|
Wohnort: Nähe München
|
|
|
|
Version: ab 2017b
|
|
|
|
|
|
Verfasst am: 08.06.2012, 08:34
Titel:
|
|
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
|
|
|
Bluesmaster |
Themenstarter
Forum-Century
|
|
Beiträge: 203
|
|
|
|
Anmeldedatum: 13.11.11
|
|
|
|
Wohnort: Gera
|
|
|
|
Version: 2012a
|
|
|
|
|
|
Verfasst am: 09.06.2012, 12:34
Titel:
|
|
@ 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
|
|
|
Jan S |
Moderator
|
|
Beiträge: 11.057
|
|
|
|
Anmeldedatum: 08.07.10
|
|
|
|
Wohnort: Heidelberg
|
|
|
|
Version: 2009a, 2016b
|
|
|
|
|
|
Verfasst am: 09.06.2012, 23:00
Titel:
|
|
|
|
|
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
|
|
|
Bluesmaster |
Themenstarter
Forum-Century
|
|
Beiträge: 203
|
|
|
|
Anmeldedatum: 13.11.11
|
|
|
|
Wohnort: Gera
|
|
|
|
Version: 2012a
|
|
|
|
|
|
Verfasst am: 10.06.2012, 10:13
Titel:
|
|
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
|
|
|
Jan S |
Moderator
|
|
Beiträge: 11.057
|
|
|
|
Anmeldedatum: 08.07.10
|
|
|
|
Wohnort: Heidelberg
|
|
|
|
Version: 2009a, 2016b
|
|
|
|
|
|
Verfasst am: 17.06.2012, 15:27
Titel:
|
|
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:
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
|
|
|
|
|
Einstellungen und Berechtigungen
|
|
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
| 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.
|
|