|
|
for-Schleife - Zeit der Durchläufe nimmt plötzlich zu |
|
gast |
Gast
|
 |
Beiträge: ---
|
 |
|
 |
Anmeldedatum: ---
|
 |
|
 |
Wohnort: ---
|
 |
|
 |
Version: ---
|
 |
|
|
 |
|
Verfasst am: 07.09.2010, 19:12
Titel: for-Schleife - Zeit der Durchläufe nimmt plötzlich zu
|
 |
Habe folgenden Code erstellt (F ist Eingabeparameter; v,b,L sind fest vorgegeben):
Das x lasse ich ausgeben, um zu sehen, wie schnell die Schleife durchläuft. Bei F = 80 ist nach einigen Sekunden x = 130.000 und die Durchläufe werden deutlich langsamer. Bei F = 10 beginnt es bereits x=15000 langsam zu werden.
Alle Vektoren, die innerhalb der Schleife verändert werden, sind vordefiniert (damit sich die Größe nicht mit jedem Schleifendurchlauf ändert).
Müssten die Operationen nicht mit konstanter Geschwindigkeit durchlaufen, sodass die komplette Schleife relativ schnell beendet wird. Woran liegt es, dass sie ab einem bestimmten Durchlauf extrem langsam wird? Hat jemand eine Idee?
|
|
|
|
|
Linus |

Forum-Fortgeschrittener
|
 |
Beiträge: 69
|
 |
|
 |
Anmeldedatum: 30.08.10
|
 |
|
 |
Wohnort: Aachen
|
 |
|
 |
Version: ---
|
 |
|
|
 |
|
Verfasst am: 07.09.2010, 19:23
Titel:
|
 |
Probleme durch fehlendes Preallocating ("variablen vordefinieren") sehen meistens schon so ähnlich aus, aber du bist dir ja sicher, dass es das nicht sein kann?
Ist das display(x) wirklich notwendig? Das ist immer sehr langsam...
[Edit] Ah, sehe gerade du hast das zu Debug-Zwecken drin. Würd ich so nicht tun, messe die Zeit echt lieber mit tic und toc, wenn du das brauchst... [/Edit]
Kennst du den Profiler? Ein absolut super Tool! Im Editor unter Tools, Open Profiler. Probier das mal für mehrere Werte aus und schau, ob du daraus schlau wirst!
_________________
RWTH - Mindstorms NXT Toolbox - free & open source
|
|
|
gast |
Gast
|
 |
Beiträge: ---
|
 |
|
 |
Anmeldedatum: ---
|
 |
|
 |
Wohnort: ---
|
 |
|
 |
Version: ---
|
 |
|
|
 |
|
Verfasst am: 07.09.2010, 21:13
Titel: danke
|
 |
Danke für die Antwort. Habe mir den Profiler angeschaut - eine sehr nützliche Funktion.
Leider sehe ich immernoch nicht, warum die Durchläufe ab einem bestimmten Zeitpunkt langsam werden.
Es scheint ein prozentualer Anteil der Schleife schnell durchzulaufen (unabhängig von F). Gibt man F=100 ein, sind die Durchläufe die für F=10 nötig wären nach einigen Sek durch. Gibt man F=10 ein, dauert es wieder ewig.
Ich kann es mir nicht erklären.
|
|
|
Jan S |

Moderator
|
 |
Beiträge: 11.057
|
 |
|
 |
Anmeldedatum: 08.07.10
|
 |
|
 |
Wohnort: Heidelberg
|
 |
|
 |
Version: 2009a, 2016b
|
 |
|
|
 |
|
Verfasst am: 07.09.2010, 22:09
Titel: Re: for-Schleife - Zeit der Durchläufe nimmt plötzlich zu
|
 |
Hallo Gast,
bitte poste den kompletten Code mit den fest vorgegebenen v, b, L. Dann könnten wir das ebenfalls laufen lassen und die Ursache der merkwürdigen Geschwindigkeitsänderungen finden.
Sind auch w und z ebenfalls ordnungsgemäß pre-allociert?
Was ist "v"?!
Wir können solche wichtigen Details nicht erraten.
Dies sieht nicht so aus, als könne es überhaupt laufen:
gast hat Folgendes geschrieben: |
|
Dise läßt sich deutlich beschleunigen:
Besser:
Gruß, Jan
|
|
|
Gast |
Gast
|
 |
Beiträge: ---
|
 |
|
 |
Anmeldedatum: ---
|
 |
|
 |
Wohnort: ---
|
 |
|
 |
Version: ---
|
 |
|
|
 |
|
Verfasst am: 08.09.2010, 01:35
Titel: danke
|
 |
Ich bin euch dankbar für eure Bemühungen. Hier der Code der Funktion (genauer der Teil, der langsam läuft). Ich habe die verschachtelte Schleife etwas umgeschrieben, weil ich gelesen habe, dass solche Schleifen langsam sein können. Nun ist es "nur" eine for-Schleife - das Problem ist aber geblieben. Ab einem bestimmten Punkt wirds deutlich langsamer (bei mir z.B. bei F=80 ab x ~ 139000)...
Bin für jede Hilfe dankbar.
|
|
|
Gast |
Gast
|
 |
Beiträge: ---
|
 |
|
 |
Anmeldedatum: ---
|
 |
|
 |
Wohnort: ---
|
 |
|
 |
Version: ---
|
 |
|
|
 |
|
Verfasst am: 08.09.2010, 02:01
Titel: oh mann
|
 |
Das umschreiben und kopieren des Codes für das Forum hat mich den Fehler tatsächlich erkennen lassen. Der Abdruck meiner rechten Handfläche wird noch einige Zeit auf meiner Stirn sichtbar sein.
Meine Vorbelegung der Vektoren s,w,z ist einfach falsch - die Länge ist zu kurz. Im Laufe der Schleife wird x irgendwann größer als der maximale Index dieser Variablen. Es kommt zur Längenänderung in jeder Iteration und damit natürlich zur Verlangsamung.
Am Ende ist es ein dummer simpler Denkfehler. Ich danke euch allen für die Hilfe. Ich denke, der Fehler kann nun behoben werden.
|
|
|
Jan S |

Moderator
|
 |
Beiträge: 11.057
|
 |
|
 |
Anmeldedatum: 08.07.10
|
 |
|
 |
Wohnort: Heidelberg
|
 |
|
 |
Version: 2009a, 2016b
|
 |
|
|
 |
|
Verfasst am: 08.09.2010, 14:50
Titel: Re: danke
|
 |
|
 |
|
Hallo Gast,
Du kannst diese Schleife noch deutlich beschleunigen:
1. berechne "v+x*5-4" und "v+x*5" nur einmal und speicher sie temporären Variablen.
2. "ones(1, 4)*(-1)" dauert deutlich länger als "[-1, -1, -1, -1]".
3. "(-1)*u_II(h)" ist wahrscheinlich langsamer als "-u_II(h)". Noch schneller könntest Du w allerdings ausserhalb der Schleife belegen:
4. Das gleiche gilt für die anderen Variablen. Ich würde zunächst statt des Index-Gepfriemels [5 x N] Matrizen erzeugen und sie hinterher in Vetoren umwandeln. Für s hätte man dann z.B.:
5. "b(Bed + x) = - L(d,h);" hängt gar nicht von der Schleifen-Variablen x ab??
Man könnte die Schleife also vollständig weglassen und wäre dadurch heftig viel schneller! Und die Preallociereung wäre auch überflüssig.
Übrigens ist dies nicht optimal als Pre-allocierung:
Zunächst wird in y nur eine "SharedDataCopy" von x gespeichert, also kein neuer Speicher allociert. Zum Glück wird das im ersten Schleife nachgeholt, so dass der Laufzeitunterschied nicht bedeutend ist.
Gruß, Jan
|
|
|
Gast |
Gast
|
 |
Beiträge: ---
|
 |
|
 |
Anmeldedatum: ---
|
 |
|
 |
Wohnort: ---
|
 |
|
 |
Version: ---
|
 |
|
|
 |
|
Verfasst am: 08.09.2010, 17:56
Titel: danke
|
 |
Vielen Dank. Interessant, dass es auch so geht. Werde die Sachen umstezen.
|
|
|
|
|
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 - 2025
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.
|
|