Verfasst am: 04.09.2013, 12:20
Titel: Matlab arbeitet zu langsam
Hi Leute,
ich habe ein kleines Problem mit meinem Programm. Seitdem ich es in einzelne Funktionen verschachtelt habe (für die bessere Übersicht), läuft es nur noch extrem langsam. Ich glaube nicht, dass es an den Funktionen selber liegt, da es genauso langsam läuft wenn man den code aus den einzelnen Funktionen direkt in die Schleife kopiert. Woran kann es liegen das Matlab plötzlich solche Probleme hat? Ist es ggf. besser alle Variablen die ihren Wert ändern als Vektor anzulegen. Ich füg euch mal den schnellen und langsamen Code ein. (der langsame code ist schon etwas erweitert , was sich aber nicht auf die Geschwindigkeit ausgewirkt hat)
das könnte unter anderem an dem fälschlich verwendeten "clear all" liegen.
Clear all sorgt dafür, dass er sich alle Funktionen aus dem Speicher löscht und diese neu von der Platte geladen werden müssen.
Das ist natuerlich nur Flickschusterrei. Wenn es aber nur an der for-Schleife liegt kann das die Zeit schonmal verkuerzen.
beste Gruesse
fekal
kili12
Gast
Beiträge: ---
Anmeldedatum: ---
Wohnort: ---
Version: ---
Verfasst am: 04.09.2013, 22:46
Titel:
Also schon mal vielen Dank für Eure Anworten.
An dem "clear all" liegt es nicht.
Was sind bzw. was ist denn bitte "präallokation "?
Das mit der Parfor-Schleife werde ich mal ausprobieren, allerdings habe ich festgestellt, wenn man einen Zähler mitlaufen lässt, dass die ersten 30000 Durchläufe super schnell sind, dann Matlab aber bis zum (ungefähr) 50000. Lauf immer langsamer wird, bis Matlab dann die letzten 30000 Durchläufe wieder in einem Schwung nimmt. Also mir kommt es so vor als ob Matlab erstmal (nach einer bestimmten Anzahl von Durchläufen) wieder Platz schaffen muss um dann (kurzzeitig) wieder schneller zu sein. Gibt es vielleicht eine Möglichkeit den Speicher zwischenzeitlich von unötigen Platzhaltern (welche wären das?) zu befreien oder das ganze durch richtige/andere Deklaration von Variablen zu umgehen?
hmm wenn man prä allokation googelt ist es leider nur der 2. anschlag. darum wahrscheinlich für die meisten nicht auffindbar
http://www.mathworks.de/support/solutions/en/data/1-18150/
prä allokation ist eine vorraussetzung für jede for schleife in der array elemente einzeln berechnet werden.
_________________
leider wird Matlab dadurch noch mal wesentlich langsamer, als ohne Präallokation. Habe ich was falsch gemacht oder liegt der Hase doch irgendwo anders im Pfeffer?
nunja deine schleife ruft recht viele unbekante funktionen auf kein plan was da gemacht wird oder was da noch so alles schief läuft ^^ in deinem oberen code berechnest du immer nur ein tout. in deiner schleife hingegen rufst du deine funktionen zb mit allen 86000 elementen von tout auf.
_________________
ja das würde auch erklären warum matlab mit prä allokation noch langsamer wird, da von anfang an mit 86400 werten gearbeitet wird und das problem eher in dieser richtung liegt,.... mit prä allokation sind die ersten 20000 durchläufe noch schnell und ohne die ersten 30000. naja wie auch immer, ich werd noch mal etwas rumprobieren,..... trotzdem danke
prä allokation ist bei jeder for schleife wichtig. es siht aber so aus als wären deine unterfunktionen nicht gut geschrieben wenn sie mit allen elementen arbeiten sollen dann gehören sie eigentlich nicht in die for schleife da es nach einer vektorisierten lösung aussiht. wenn sie aber nur mit einem elemt arbeiten dann darfst du ihnen auch nur das eine element übergeben.
_________________
Verfasst am: 11.09.2013, 16:37
Titel: Re: Matlab arbeitet zu langsam
Hallo kili12,
Ich kann den Code kaum lesen. Zunächst würde ich alles auswählen und per Strg-I eine saubere Code-Indentation durchführen. Spaces sind dabei besser als Tabs.
Im nächsten Schritt ist der bereits empfohlene Profiler wärmstens zu empfehlen, da er die zeitfreesenden Code-Teile ermitteln kann. Es lohnt sich nicht eine Minute Zeit in die Optimierung einer Zeile zu stecken, die nur 0.01 Sekunden Laufzeit hat. Eine Laufzeitoptimierung ist immer nur am zeitaufwendigsten Teil effizient und wirksam.
Den Code könnte man auch nioch etwas aufräumen, z.B.:
"length(G)" gibt einen skalaren Wert zurück, das max() kann man sich dann sparen.
Man kann aber auch gleich die ganze Schleife weglassen und schreiben:
Die Variablennamen zahl1, zahl60, zahler, zahl2, zahln, zahl sind schlicht verwirrend. Ich halte es für kaum möglich, in dem Dickicht nach Bugs zu suchen. Ich würde deshalb den ganzen Code nochmal schreiben und versuchen eine einfache und klare Methode für die Namen zu verwenden.
Über prä-allokation erfährt man mehr, wenn man Google nach dem Englischen "pre-allocation Matlab" fragt.
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
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.