|
|
Performance bei Schleifen verbessern |
|
LordExcalibur |

Forum-Anfänger
|
 |
Beiträge: 39
|
 |
|
 |
Anmeldedatum: 08.05.10
|
 |
|
 |
Wohnort: ---
|
 |
|
 |
Version: ---
|
 |
|
|
 |
|
Verfasst am: 04.10.2012, 21:20
Titel: Performance bei Schleifen verbessern
|
 |
Hallo,
ich habe ein kleines Skript geschrieben um einen Binomialbaum zu erstellen.
Den Code habe ich hier (etwas gekürzt) eigefügt:
Das Problem ist, dass die Perfomance etwas zu wünschen übrig lässt. Ich muss einen Baum mit einer Tiefe von 24 erstellen. Das dauert bei mir am Rechner einige Minuten. Mir ist klar, dass der Baum 2^24 Knoten hat und daher schon sehr groß ist, aber vielleicht gibt es ja hier noch etwas Optimierungspotential.
Viele Grüße.
Sebastian
|
|
|
|
|
dmjr |

Forum-Century
|
 |
Beiträge: 199
|
 |
|
 |
Anmeldedatum: 02.10.12
|
 |
|
 |
Wohnort: ---
|
 |
|
 |
Version: ---
|
 |
|
|
 |
|
Verfasst am: 05.10.2012, 00:15
Titel:
|
 |
Bevor du dir über die Performance gedanken machst sollte der Code erstmal korrekt sein.
Diese beiden Zeile dürften zu viel sein:
cnode=cnode+1;
cdepth=cdepth+1;
Die Variablen werden schon jeweils durch die Schleife selbst hochgesetzt.
Ansonsten kannst du tree noch preallokieren (vor der ersten Verwendung in der richtigen Größe erstellen):
tree = zeros(treedepth,4)
|
|
|
Harald |

Forum-Meister
|
 |
Beiträge: 24.501
|
 |
|
 |
Anmeldedatum: 26.03.09
|
 |
|
 |
Wohnort: Nähe München
|
 |
|
 |
Version: ab 2017b
|
 |
|
|
 |
|
Verfasst am: 05.10.2012, 00:39
Titel:
|
 |
Hallo,
als erstes sollte man sich die Warnungen von Code Analyzer ansehen, um ein Programm zu verbessern.
Hier würde ich das aber vollkommen anders angehen: die einzelnen Spalten haben ja eine relativ leicht erstellbare Struktur. Man muss den Baum also nicht explizit Stück für Stück erstellen, sondern kann die Spalten auf einen Schlag erzeugen.
Ich komme bei treedepth=24 auf 2,2 Sekunden.
Mit etwas Geschick kann man vielleicht noch mehr rausholen.
Grüße,
Harald
|
|
|
LordExcalibur |
Themenstarter

Forum-Anfänger
|
 |
Beiträge: 39
|
 |
|
 |
Anmeldedatum: 08.05.10
|
 |
|
 |
Wohnort: ---
|
 |
|
 |
Version: ---
|
 |
|
|
 |
|
Verfasst am: 05.10.2012, 10:19
Titel:
|
 |
dmjr hat Folgendes geschrieben: |
Bevor du dir über die Performance gedanken machst sollte der Code erstmal korrekt sein.
Diese beiden Zeile dürften zu viel sein:
cnode=cnode+1;
cdepth=cdepth+1;
Die Variablen werden schon jeweils durch die Schleife selbst hochgesetzt.
|
Wenn ich die beiden Zeilen auskommentiere bekomme ich ein falsches Ergebnis als Output. Konkret fehlen Zeilen in der Ergebnismatrix.
|
|
|
LordExcalibur |
Themenstarter

Forum-Anfänger
|
 |
Beiträge: 39
|
 |
|
 |
Anmeldedatum: 08.05.10
|
 |
|
 |
Wohnort: ---
|
 |
|
 |
Version: ---
|
 |
|
|
 |
|
Verfasst am: 05.10.2012, 11:12
Titel:
|
 |
|
 |
|
Harald hat Folgendes geschrieben: |
Hallo,
als erstes sollte man sich die Warnungen von Code Analyzer ansehen, um ein Programm zu verbessern.
Hier würde ich das aber vollkommen anders angehen: die einzelnen Spalten haben ja eine relativ leicht erstellbare Struktur. Man muss den Baum also nicht explizit Stück für Stück erstellen, sondern kann die Spalten auf einen Schlag erzeugen.
Ich komme bei treedepth=24 auf 2,2 Sekunden.
Mit etwas Geschick kann man vielleicht noch mehr rausholen.
|
Das funktioniert schon sehr gut. Dauert bei mir zwar etwas mehr als 2,2s ist aber um ein Vielfaches schneller wie die Schleife.
Was mir noch nicht ganz klar ist, wie genau die 3. Spalte geschrieben wird. Das Ergebnis ist korrekt, ich kann deinem Programmcode an dieser Stelle jedoch nicht ganz folgen.
Jetzt geht das ganze weiter. Vielleicht könnt ihr mir hier schonmal ein paar Performancetips geben bevor ich mit der Implementierung anfange.
Es geht darum jedem Knoten noch 2 weitere Parameter zuzuweisen. Zum einen sind das die Kosten für den vorangegangenen Pfad. Diese hängen zum einen von der Entscheidung (Pfadwahl) ab, also davon ob der aktuelle Knoten der linke oder der rechte Sohn ist und zum anderen von dem aktuellen Preis (der wird separat modelliert).
Der zweite Parameter hängt ebenfalls von der Pfadwahl sowie von der Historie eines anderen Paramters ab (wird auch separat berechnet).
Ich gehe davon aus, dass ich hier nicht drum herrumkomme den Baum einmal komplett zu durchlaufen, oder lassen sich solche Entscheidungen und Berechnungen auch vektorisieren?
|
|
|
Harald |

Forum-Meister
|
 |
Beiträge: 24.501
|
 |
|
 |
Anmeldedatum: 26.03.09
|
 |
|
 |
Wohnort: Nähe München
|
 |
|
 |
Version: ab 2017b
|
 |
|
|
 |
|
Verfasst am: 05.10.2012, 11:20
Titel:
|
 |
Hallo,
zur dritten Spalte am Beispiel mit treedepth = 3:
Erst die 0, dann die Zahlen von 1 bis 7 je 2 Mal.
Also
1 2 ... 7
wird zu
1 2 ... 7
1 2 ... 7
wird umgewandelt in einen Vektor
1
1
2
2
...
...
7
7
Implementier das doch erst mal so. Wenn man dann ein bestimmtes Muster in diesen Kosten erkennt, kann man sehen, wie man das wiederum effizienter erstellen kann.
Grüße,
Harald
|
|
|
|
|
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.
|
|