LabVIEWForum.de
Warum ist mein programm so langsam? - Druckversion

+- LabVIEWForum.de (https://www.labviewforum.de)
+-- Forum: LabVIEW (/Forum-LabVIEW)
+--- Forum: LabVIEW Allgemein (/Forum-LabVIEW-Allgemein)
+--- Thema: Warum ist mein programm so langsam? (/Thread-Warum-ist-mein-programm-so-langsam)

Seiten: 1 2


Warum ist mein programm so langsam? - D3nnis.C - 07.12.2007 07:43

Hallo,
ich habe untestehendes programm erstellt. In dem Programm soll zu Begin ein "Kalender" erstellt werden der kalender soll von nun an 60 tage weiter zaehlen, das allerdings in minuten, das waeren dann 86400 minuten.

Aus diesen daten will ich dann ein arry erstellen, das geht auch noch relativ schnell.
Als naechstes lese ich daten aus einer txt datei ein und moechte dies mit jedem einzelnen der 86400 felder vergleichen.
Aber dann wird das Programm sehr langsam, kann mir vielleicht jmd sagen was ich falsch mache?

Dennis

(VI LV 8.2)


Warum ist mein programm so langsam? - Lutzi - 07.12.2007 09:00

1. Du solltest überprüfen, welche Aktionen aus deinen For Schleifen rausgenommen werden.
Kleines Beispiel:
Für den Vergleich holst Du jedesmal aus deinen Zeiten Array das Elemen index, das muss doch nicht sein, einmal holen zu beginn reicht doch?
2. Die Reservierung von Speicher braucht Zeit. Du solltest besser for Schleifendurchlauf deine Arrays dinensionieren und die entsprechenden Elemente nur austauschen


Warum ist mein programm so langsam? - Y-P - 07.12.2007 09:25

Mach' mal 'ne Zeitverzögerung von z.B. 1 ms in Deine For-Schleifen.

Gruß Markus


Warum ist mein programm so langsam? - jg - 07.12.2007 19:28

' schrieb:Mach' mal 'ne Zeitverzögerung von z.B. 1 ms in Deine For-Schleifen.

Gruß Markus
@Markus: Was soll das denn bringen?

@Dennis: Das meiste hat Lutzi schon gesagt. Ein paar Ergänzungen:
1. GANZ schlecht: Schreiben eines Wertes per PropertyNode->Value, wie du es mit der Variable Index machst. Das Setzen per PropertyNode erzwingt immer ein Update des Frontpanel -> sehr schlechte Performance! An dieser Stelle ist das in deinem VI auch vollkommen unnötig. Einfach den Index von der äußeren Loop in die innere per Verdrahtungstool weiterziehen, fertig.
2. In deiner äußeren Schleife schreibst du immer wieder einen Zwischenvergleich in das Array4. Hier wird zwar nicht unbedingt ein FP-Update erzwungen, aber wahrscheinlich wird es doch recht häufig gemacht. Und dann müssen eine Menge Werte aktualisert werden, kostet auch etwas Zeit.
3. Auch beim Lesen erzeugen PropertyNodes einen großen Overhead, hat also im inneren einer "DoppelLoop" erst recht nichts verloren.
4. Etwas, was man in einer äußeren Schleife machen kann (bei dir das Auslesen Zeitelement) macht man nie in die innere Loop, da man das ja völlig überflüssigerweiser mehrfach macht.

Also merke: PropertyNode->Langsam, großer Overhead!

Hier noch ein paar Schritte zur Verbesserung:
[attachment=10233](besser, aber noch nicht optimal)
[attachment=10234](noch besser)
[attachment=10235](Version mit Autoindexing!)
und zum Schluss noch einfacher:
[attachment=10236]

MfG, Jens

P.S.: Bitte in Zukunft beachten.


Warum ist mein programm so langsam? - D3nnis.C - 09.12.2007 09:31

Danke erst mal für die Antworten,
@Jens, bei deiner dritten und vieren Lösung werden doch nur die beiden Felder verglichen ob sie gleich sind oder?
Ich muss aber jedes element aus dem zeiten feld mit jedem element aud dem "Kalenderfeld" vergleichen.

Wenn ich die Lösungen 1 und 2 nachbauen will, bekomme ich das auch nicht hin.
Da sobald ich die verbindungen vom Kalender oder Zeiten in die For-schleife ziehe, sind es keine arrys mehr sondern nur noch einfache felder und dann kann ich natürlich kein Index arry mehr machen.
Was mach ich da falsch?
[attachment=10242]

Ich weiss für euch sind die Fragen wahrscheinlich blöd, aber ich arbeite erst seit 2 Wochen mit LabVIEW und muss mir alles selber beibringen.
Dennis


Warum ist mein programm so langsam? - jg - 09.12.2007 11:43

Hallo, Dennis,

alle Versionen von mir sind vom Ergebnis her vollkommen identisch.

Zu deinem Fehler (und gleichzeitig die Erklärung, wieso V2 & V3 identisch sind):
Es gibt in LV ein Konzept, das sich "Auto-Indexing" nennt. Wenn du ein Array in eine While- oder For-Schleife führst, kannst du entweder das gesamte Array weiterführen (Indexing aus) oder automatisch nur dasjenige Array Element weiterführen, das gerade der dem Index i der Schleifendurchführung entspricht. An- und Abschalten geht über Kontext-Menü:
[attachment=10241]
Du sparst dir somit das "Index-Array"-Element, bei FOR-Schleifen kann man sogar bei Auto-Indexing auf den Anschluss einer Zahl an die Anzahl der Schleifendurchführungen N verzichten, das macht LV selber. Somit sind also V2 & V3 identisch.

Übrigens, beim Ausgang an der FOR-Schleife hast du dieses Konzept ja auch schon verwendet.

Jetzt noch zur 4. Variante, ist ebenfalls identisch. Eine ganze Reihe von LV-Funktionen kann auch Arrays oder Cluster miteinander vergleichen, so auch der "="-Operator. Er kann auch ein Array mit einem Element vergleichen, dabei wird automatisch jedes Element des Arrays mit dem Vergleichselement verglichen, Ausgang ist dann ein Array.

Alles paletti?

MfG, Jens


Warum ist mein programm so langsam? - D3nnis.C - 09.12.2007 21:29

@Jens,
alles paletti ist anders Rolleyes
aber vielen dank, aber das wirft nun noch eine frage auf. Ich wollte das die vergleich ergebinsse nun nicht in einem 2darry speichern sondern in einem 1d arry.
deshalb habe ich nun auch beim ausgang auf disable index gestellt.
das müste doch dann funktionieren wenn ich das nun richtig verstanden hab oder?
Es funktioniert aber nicht :angry2:
[attachment=10243]
Dennis

PS: Woher kannst du das so gut?
Ich will das auch lernen!!!


Warum ist mein programm so langsam? - jg - 09.12.2007 23:23

' schrieb:@Jens,
alles paletti ist anders Rolleyes
aber vielen dank, aber das wirft nun noch eine frage auf. Ich wollte das die vergleich ergebinsse nun nicht in einem 2darry speichern sondern in einem 1d arry.
Das ist ja jetzt eine ganz neue Info! Wozu eigentlich, durch das 2D-Array hast du doch eine schöne Info, welchen Datenindex du gerade verglichen hast.
' schrieb:deshalb habe ich nun auch beim ausgang auf disable index gestellt.
das müste doch dann funktionieren wenn ich das nun richtig verstanden hab oder?
Es funktioniert aber nicht :angry2:
[attachment=37252:Namenlos.png]
Dennis
Nein, jetzt machst du einem Denkfehler beim Datenflusskonzept von LabVIEW. Wenn du das Autoindex am Ausgang der Schleife auf Disable stellt, führst du nur noch das allerletzte Vergleichsarray weiter und verwirftst alle vorherigen Vergleiche. Wenn du also ein Array aller Vergleiche hintereinander brauchst, dann könntest du z.B. Reshape-Array-Funktion aus der Array-Palette das per Autoindex erzeugte 2D-Array in ein 1D-Array wandeln. Oder du schaust dir mal den Tip von Lutzi (Beitrag #2) an.
' schrieb:PS: Woher kannst du das so gut?
Ich will das auch lernen!!!
Guckst du auf mein Profil, für irgendwas müssen jetzt bald 9 Jahre Erfahrung ja wohl gut sein. Und zwecks Lernen, schau dir die Bsp. an (stickwort NI-Examplefinder), arbeite ein gutes Einführungsbuch durch, oder besuche einen Kurs von NI. Dann hast du nach ein paar Monaten die Basics von LV drauf.

MfG, Jens


Warum ist mein programm so langsam? - D3nnis.C - 11.12.2007 13:56

[Das ist ja jetzt eine ganz neue Info! Wozu eigentlich, durch das 2D-Array hast du doch eine schöne Info, welchen Datenindex du gerade verglichen hast.]

Ich will 15 txt files mit einander vergleichen, so das maximal zwei zusammen laufen und das für 2 monate im vorraus, daher die 86400 schritte, das sollen minuten sein. Darum mache ich dann für jede minute im "kalender" die auch in einer meiner zeiten steht, eine 1. Nachher will ich dann die einzelnen 1d arrys mit einander vergleichen. um zu kontrollieren, ob es überschneidungen gibt.
Daher muss ich das jetzt irgendwie in ein 1d arry um formen, mit der Reshape arry funktion kann ich zwar eine dimension löschen, aber dann bekommen ich doch auch nur ein ergebnis und zwar das aus der ersten Spalte.
[attachment=10285]

und bei dem beispiel vom Lutzi bekommt man auch ein 2d arry,
Gibt es eine möglichkeit jetzt ganz einfach mit einer funktion oder sowas aus dem 2d ein 1d zumachen in dem aber dann jedes lämpchen brennt, das auch in dem 2d brennt, nur halt neben einander, ohne das ich jetzt erst wieder mit schleifen und so anfang?
Dennis


Warum ist mein programm so langsam? - jg - 11.12.2007 16:54

Natürlich geht das mit der Reshape Array Funktion:

[attachment=10291]

MfG, Jens