|
|
Effizienter Code versus Vektorisierung |
|
Jan S |
Moderator
|
|
Beiträge: 11.057
|
|
|
|
Anmeldedatum: 08.07.10
|
|
|
|
Wohnort: Heidelberg
|
|
|
|
Version: 2009a, 2016b
|
|
|
|
|
|
Verfasst am: 09.12.2016, 10:08
Titel: Effizienter Code versus Vektorisierung
|
|
|
|
|
Aufgabe: Erstelle eine CHAR-Matrix wie folgt:
1. Erster Versuch:
2. Pre-allocation: "pattern" iterativ wachsen zu lassen benötigt viele Resourcen, weil in jeder Iteration ein neues Array erstellt wird und die vorherigen Werte kopiert werden. Wenn man den Output vor der Schleife erstellt, werden nur die jeweiligen Werte einkopiert:
3. Matlab speichert Arrays spalten-orientiert.
pattern(ii, :)
schreibt deshalb in Speicherzellen, die weit von einander entfernt liegen. Zudem ist k immer kleiner als die String-Länge, sodass die Schleife kürzer wird, wenn man über die Spalten iteriert:
4. Vektorisieren - das beschleunigt sehr viele Matlab Programme, aber nicht alle:
5. Wie sieht das in C aus?
Und die Laufzeiten? Matlab 2015b 64, Win7, Mittelwert aus 100 Iterationen:
Schlußfolgerung:
1. Pre-allocation ist fundamental.
2. Spalten-orientiertes Bearbeitung ist besser als zeilenweises Vorgehen.
3. Reduziere die Schleifen-Größe, wenn möglich. Bei geschachtelten Schleifen, ziehe die kürzere nach außen. (Ist hier nicht passend)
4. Vektorisierter Code ist nicht schneller, wenn dazu große temporäre Index-Array erzeugt werden müssen. Hier besteht die Hauptarbeit aus dem Kopieren der Unter-Strings, und das geht mit einer Schleife bereits effizient, während der vektorisierte Code praktisch die doppelte Arbeit hat.
5. Der C-Code ist schnell, aber im Vergleich zu Matlab umständlich, häßlich und fehleranfällig. Hier mal einen Index falsch setzen lässt gleich die ganze Matlab-Session crashen - und wenn man Pech hat nur manchmal.
6. Der C-Mex code ist 7 mal schneller als die beste M-Version. Aber wenn die vom Gesamtprogramm nur 1% benötigt, sinkt die Laufzeit nur um 0.86%. Da kümmert man sich also besser um das Bottleneck, das man mit dem Profiler findet.
7. Die erhaltene Matrix "pattern" ist sehr redundant. Wahrscheinlich wäre es viel effizienter im Code direkt
str(ii:ii+k-1)
zu verwenden.
|
|
|
|
|
|
|
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.
|
|