Werden bei SubVI-Aufrufen immer Datenkopien angelegt?
Wenn dein Problem oder deine Frage geklärt worden ist, markiere den Beitrag als "Lösung",
indem du auf den "Lösung" Button rechts unter dem entsprechenden Beitrag klickst. Vielen Dank!
Werden bei SubVI-Aufrufen immer Datenkopien angelegt?
Hallo,
ich habe in LabView 8.2 ein VI geschrieben, welches einen Teil eines Arrays glättet. Man übergibt also das Array, einen Startindex und eine Länge und das VI gibt das Array zurück, wobei eben der angegebene Bereich geglättet ist.
Intern läuft es so, daß aus dem Eingangs-Array der zu glättende Teil extrahiert wird (Sub-Array) und am Schluss mit Replace Array Subset die ursprünglichen Daten durch die neuen Daten ersetzt werden.
Nun ist mir aufgefallen, daß das VI extrem langsam wird, wenn das zu übergebende Array lang wird. Dabei sollte die Länge des Arrays für die Rechenzeit keine Rolle spielen! Denn von Interesse für den Algortihmus ist nur die Länge des zu glättenden Intervalls, und die ist in diesem Fall konstant und gering (einige Messpunkte).
Ich habe mir daraufhin alle Buffer-Allocationen anzeigen lassen und habe bemerkt, daß scheinbar beim Übergeben des Arrays ins VI ein Buffer alloziert wird (siehe Anhang). Da das Array einige Millionen Messpunkte enthalten kann, kann dies Speicher- und Geschwindigkeitsprobleme mit sich bringen. Alle anderen Allocationen haben nur die Länge des zu glättenden Intervalls (einige Messpunkte) und sind somit nicht kritisch!
Ich wollte nun fragen, ob es bei Labview Standart ist, daß von Arrays bei der Übergabe an (Sub-)VIs Kopien angelegt werden. Ich kenne das aus den Standart-Programmiersprachen so, daß Arrays immer per Referenz übergeben werden. Lässt sich das in LabView 8.2 auch irgendwie realisieren? Gibt es da irgendwo eine Option im Compiler oder bei den VI-Einstellungen?
Zur Not kann ich zwar einen Workaround machen, indem ich nur den zu glättenden Teil an das VI übergebe (ich habe das schon probiert, es ist deutlich schneller), doch irgendwie möchte ich mich nicht damit abfinden, daß jedes VI Kopien der Arrays anlegt.
Danke für die Antworten!!!
Thomas
Anzeige
14.02.2011, 08:10 (Dieser Beitrag wurde zuletzt bearbeitet: 14.02.2011 08:13 von Falk.)
RE: Werden bei SubVI-Aufrufen immer Datenkopien angelegt?
Hallo Thomas!
(13.02.2011 18:28 )Thomasschoenau schrieb: Ich wollte nun fragen, ob es bei Labview Standart ist, daß von Arrays bei der Übergabe an (Sub-)VIs Kopien angelegt werden. Ich kenne das aus den Standart-Programmiersprachen so, daß Arrays immer per Referenz übergeben werden. Lässt sich das in LabView 8.2 auch irgendwie realisieren? Gibt es da irgendwo eine Option im Compiler oder bei den VI-Einstellungen?
Ich würde sagen ja. Hintergrund dürfte der sein, dass in dem Moment wo du den Array im SubVI erstellst hat der Kompiler keinerlei Informationen darüber wie lange der Array zur Laufzeit sein wird. Ist ja sowieso variabel. Dementsprechend reserviert er Speicher.
Auch könntest du hinsichtlich Leistung noch folgendes ausprobieren. Vor der For-Schleife initialisierst du dir einen neuen Array mit der Länge deines zu glättenden Bereiches. Warum nimmst du nicht gleich deinen Eingangsarray und ersetzt innerhalb der Schleife gleich die alten mit den neuen Werten?
RE: Werden bei SubVI-Aufrufen immer Datenkopien angelegt?
(13.02.2011 18:28 )Thomasschoenau schrieb: Ich habe mir daraufhin alle Buffer-Allocationen anzeigen lassen und habe bemerkt, daß scheinbar beim Übergeben des Arrays ins VI ein Buffer alloziert wird (siehe Anhang).
Moin,
bei Eingängen wirst du _immer_einen Bufferallocation angezeigt bekommen, inwiefern diese sich aber tatsächlich als Kopie im Aufrufkontext auswirkt, siehst du damit nicht.
Wenn du eine Ebene höher gehts sieht du ggf. den Puffer am SubVI-Eingang. BufferAllocations
Mit dem Desktion Trace Execution Toolkit kannst du dir das dynamisch anzeigen lassen (glaube das gibt's allerdings erst seit 2009).
Was mglw. ohne Aufwand die Laufzeit verbessert ist, das Debugging der kritischen VIs abzuschalten.
Wenn du nur per Referenz auf die Daten zugreifen willst, bleiben dir unter 8.2 afaik nur SingleElementQueues (SEQs).
Ich würde es auch probieren, daß VI und seine SubVIs so umzubauen, das du das Array komplett durch verdrahtest (durch alle Cases, per SR durch alle Schleifen), muss allerdings nicht funktionieren.
RE: Werden bei SubVI-Aufrufen immer Datenkopien angelegt?
Meine Erfahrung deckt sich mit macmarvin.
Bei einem geschickt programmierten SubVI wird keine Datenkopie eines Arrays angelegt.
In deinem Screenshot dürfte ungünstig sein, dass du einen Abzweig in eine For-Loop hast. Probiere es - wie schon von macmarvin geraten, mit einem Durchschleifen per Schieberegister.
Gruß, Jens
Wer die erhabene Weisheit der Mathematik tadelt, nährt sich von Verwirrung. (Leonardo da Vinci)
!! BITTE !! stellt mir keine Fragen über PM, dafür ist das Forum da - andere haben vielleicht auch Interesse an der Antwort!
RE: Werden bei SubVI-Aufrufen immer Datenkopien angelegt?
(14.02.2011 12:48 )jg schrieb: Bei einem geschickt programmierten SubVI wird keine Datenkopie eines Arrays angelegt.
Das heißt, wenn ich in einem VI alle Anschlüsse des Anschlussbloxs eines SubVIs verdrahte, dann muss nicht zwangsläufig neuer Speicher addressiert werden? Ich dachte das passiert sofort, wenn ein Kontrollelement auf dem Front Panel liegt. Ich muss wohl noch einmal darüber nachdenken.
Schöne Grüße
Falk
Currently: zzzZZZZZZZZ
14.02.2011, 13:07 (Dieser Beitrag wurde zuletzt bearbeitet: 14.02.2011 13:09 von jg.)
RE: Werden bei SubVI-Aufrufen immer Datenkopien angelegt?
@Falk:
Du hast schon nicht unrecht mit der Datenkopie und FP. Aber bei einem SubVI öffnet sich in der Regel bei der Abarbeitung kein FP, und somit wird da gar nichts aktualisert.
Es kommt bei der Übergabe eines Arrays sehr darauf an, ob LV erkennen kann, dass das Array durchgeschliffen wird. Da hilft manchmal nur Trial und Error.
Gruß, Jens
Wer die erhabene Weisheit der Mathematik tadelt, nährt sich von Verwirrung. (Leonardo da Vinci)
!! BITTE !! stellt mir keine Fragen über PM, dafür ist das Forum da - andere haben vielleicht auch Interesse an der Antwort!
RE: Werden bei SubVI-Aufrufen immer Datenkopien angelegt?
(14.02.2011 13:07 )jg schrieb: @Falk:
Du hast schon nicht unrecht mit der Datenkopie und FP. Aber bei einem SubVI öffnet sich in der Regel bei der Abarbeitung kein FP, und somit wird da gar nichts aktualisert.
Aaaahhhhhh ja stimmt. Eine Randbedingung ist ja davon ob das Front Panel eines SubVIs überhaupt in den Speicher geladen wird. Und das passiert ja wiederrum nur, wenn es auch geöffnet wird beziehungsweise Property Nodes erhält, die das FP verändern. Daran habe ich nicht gedacht.