INFO: Dieses Forum nutzt Cookies...
Cookies sind für den Betrieb des Forums unverzichtbar. Mit der Nutzung des Forums erklärst Du dich damit einverstanden, dass wir Cookies verwenden.

Es wird in jedem Fall ein Cookie gesetzt um diesen Hinweis nicht mehr zu erhalten. Desweiteren setzen wir Google Adsense und Google Analytics ein.


Antwort schreiben 

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!

13.02.2011, 18:28
Beitrag #1

Thomasschoenau Offline
LVF-Grünschnabel
*


Beiträge: 10
Registriert seit: Feb 2007

8.2, 2010 SP1
2006
EN


Deutschland
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


Angehängte Datei(en) Thumbnail(s)
   
Alle Beiträge dieses Benutzers finden
Diese Nachricht in einer Antwort zitieren to top
14.02.2011, 08:10 (Dieser Beitrag wurde zuletzt bearbeitet: 14.02.2011 08:13 von Falk.)
Beitrag #2

Falk Offline
ja, das bin ich...
***


Beiträge: 343
Registriert seit: Jan 2006

8.0 :: 201x ::202x
2006
DE_EN


Deutschland
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?

Schöne Grüße
Falk

Currently: zzzZZZZZZZZ
Webseite des Benutzers besuchen Alle Beiträge dieses Benutzers finden
Diese Nachricht in einer Antwort zitieren to top
14.02.2011, 10:19
Beitrag #3

macmarvin Offline
CLA
***


Beiträge: 445
Registriert seit: Sep 2006

2014
2004
EN

81373
Deutschland
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.
Alle Beiträge dieses Benutzers finden
Diese Nachricht in einer Antwort zitieren to top
14.02.2011, 12:48
Beitrag #4

jg Offline
CLA & CLED
LVF-Team

Beiträge: 15.864
Registriert seit: Jun 2005

20xx / 8.x
1999
EN

Franken...
Deutschland
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!

Einführende Links zu LabVIEW, s. GerdWs Signatur.
Alle Beiträge dieses Benutzers finden
Diese Nachricht in einer Antwort zitieren to top
14.02.2011, 13:01
Beitrag #5

Falk Offline
ja, das bin ich...
***


Beiträge: 343
Registriert seit: Jan 2006

8.0 :: 201x ::202x
2006
DE_EN


Deutschland
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
Webseite des Benutzers besuchen Alle Beiträge dieses Benutzers finden
Diese Nachricht in einer Antwort zitieren to top
14.02.2011, 13:07 (Dieser Beitrag wurde zuletzt bearbeitet: 14.02.2011 13:09 von jg.)
Beitrag #6

jg Offline
CLA & CLED
LVF-Team

Beiträge: 15.864
Registriert seit: Jun 2005

20xx / 8.x
1999
EN

Franken...
Deutschland
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!

Einführende Links zu LabVIEW, s. GerdWs Signatur.
Alle Beiträge dieses Benutzers finden
Diese Nachricht in einer Antwort zitieren to top
14.02.2011, 13:27
Beitrag #7

dimitri84 Offline
Astronaut
*****


Beiträge: 1.496
Registriert seit: Aug 2009

2020 Developer Suite
2009
DE_EN

53562
Deutschland
RE: Werden bei SubVI-Aufrufen immer Datenkopien angelegt?
Nebenfrage: In wie weit hilft das seit 2010 mögliche Inlining bei der Vermeidung unnötiger Datenkopien?

„Sag nicht alles, was du weißt, aber wisse immer, was du sagst.“ (Matthias Claudius)
Webseite des Benutzers besuchen Alle Beiträge dieses Benutzers finden
Diese Nachricht in einer Antwort zitieren to top
14.02.2011, 14:50
Beitrag #8

Falk Offline
ja, das bin ich...
***


Beiträge: 343
Registriert seit: Jan 2006

8.0 :: 201x ::202x
2006
DE_EN


Deutschland
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. Denknach

Schöne Grüße
Falk

Currently: zzzZZZZZZZZ
Webseite des Benutzers besuchen Alle Beiträge dieses Benutzers finden
Diese Nachricht in einer Antwort zitieren to top
30
Antwort schreiben 


Möglicherweise verwandte Themen...
Themen Verfasser Antworten Views Letzter Beitrag
  Nur ein SubVI in Whileschleife soll verzögert werden mikadm 2 3.475 12.08.2020 14:54
Letzter Beitrag: mikadm
  Werte aus SubVI werden nicht aktualisiert McButch 24 13.383 13.10.2016 14:20
Letzter Beitrag: jg
  Referenzen in Variable speichern und in SubVI aufrufen Hasenfuss 16 12.772 30.04.2015 08:09
Letzter Beitrag: Hasenfuss
  Histogramme werden nicht immer aktualisiert, obwohl Autoskalierung aktiv ist dali4u 3 3.678 27.11.2014 16:56
Letzter Beitrag: GerdW
  SubVI immer im Vordergrund StabSH 9 11.968 07.12.2012 09:30
Letzter Beitrag: Keppi
  Button reagiert nur beim ersten Aufrufen der SubVI c_Kay 8 6.707 12.10.2012 15:40
Letzter Beitrag: c_Kay

Gehe zu: