LabVIEWForum.de
lokale vs. globale vs. fuktionale globale Variablen - Druckversion

+- LabVIEWForum.de (https://www.labviewforum.de)
+-- Forum: LabVIEW (/Forum-LabVIEW)
+--- Forum: LabVIEW Allgemein (/Forum-LabVIEW-Allgemein)
+--- Thema: lokale vs. globale vs. fuktionale globale Variablen (/Thread-lokale-vs-globale-vs-fuktionale-globale-Variablen)



lokale vs. globale vs. fuktionale globale Variablen - Thomasschoenau - 09.04.2007 10:14

Hallo,
ich stehe vor einem (für meine Verhältnisse) etwas grösserem Projekt. Es geht darum, ein Programm zu schrieben, was Graphen aus Textdateien läd und einige Tools zur Bearbeitung bereitstellt. Es sollen also Bereiche aus den Graphen editiert werden können (Punkte markieren, verschieben, löschen, ausklingen lassen, etc) und auch mehrere Graphen voneinader abgezogen oder miteinander multipliziert werden können.
Nun stehe ich vor dem Problem, daß ich recht viele Daten speichern muss und keine Lust habe, 10 bis 20 Drähte von einem Shift-Register zum nächsten zu ziehen (und dann auch noch durch alle Event-Cases). Man könnte diese zwar bündeln aber das ist in meinen Augen auch mehr eine Scheinlösung, da ich dann ständig am bündeln und entbündeln bin.

Am elegantesten erscheinen mir dehalb lokale/globale bzw. funktionale globale Variablen.
Allerdings habe ich in mehreren Texten gelesen, daß man, wenn möglich, auf globale Variablen verzichten sollte, weil:
1. schlechter Programmierstil (sehe ich ein)
2. zu langsam, da Kopie von den Daten angelegt wird

Stattdessen werden funktionale globale Variablen empfohlen, weil diese keine Kopien anfertigen.

Ich habe mal ein paar Geschwindigkeitstests gemacht (VI siehe Anhang) und dabei kam folgendes raus:

1.Platz: lokale Variable: 11 .. 12s
2.Platz: funktionale globale Variable: 14s
3.Platz: globale Variable: 17s

was mich hier verwundert, ist daß die lokale Variable schneller ist als die funktionale globale Variable. Ist das normal, oder habe ich was falsch gemacht?

im Anhang:
main lokale Variable.VI --> Testprogramm lokale V.
main functional global.VI --> Testprogramm funktinale globale V.
functional global.VI --> funktinale globale V.


Gibt es noch witere Ideen, die vielen Shift-Register zu vermeiden?

Danke im Voraus
und frohe Restostern!


lokale vs. globale vs. fuktionale globale Variablen - IchSelbst - 09.04.2007 11:17

' schrieb:2. zu langsam, da Kopie von den Daten angelegt wird
Geschwindigkeit ist relativ (wer hat das noch mal gesagt?) Das Arbeiten mit Strings ist wesentlich aufwändiger als eben mal eine neue Datenkopie anlegen. (Wobei ich hier mal keine Aussagen machen will über eine Grenze, die es sehr wohl gibt: Was tun, wenn der Datensatz 1MB groß ist?).

Zitat:was mich hier verwundert, ist daß die lokale Variable schneller ist als die funktionale globale Variable.
Immerhin hat ein SubVI-Aufruf ja selbst einen Overhead. Auch befindet sich ja im SubVI ein Programm, das abgearbeitet werden muss. Eine funktionale Variable ist also prinzipiell langsamer.

Funktionale Variablen haben diverse Vorteile. So kann man in das entsprechende SubVI auch datenspezifischen Code legen und mittels eines Enumarator-Eingangs diverese Operationen ausführen lassen (wenn's die Applikation halt so verlangt). Auch kann man natürlich mehrere Ausgänge aus dem SubVI haben. Eine solche "Funktionale Variable" ist dann im Prinzip auch nichts anderes als eine gekapselte Klasse einer textbasierten Programmiersprache.

Globale Variablen sind zwar schnell und bequem in der Handhabung während der Programmierung, ich würde aber trotzdem im Falle eines Falles zu den funktionalen Variablen raten. Noch besser als funktionale Variablen sind natürlich Schieberegister. In deinem Falle kann man beides verbinden.

Nachtrag:
Oder noch besser: Die Operation in das SubVI auslagern.


lokale vs. globale vs. fuktionale globale Variablen - Lucki - 09.04.2007 19:09

' schrieb:Gibt es noch witere Ideen, die vielen Shift-Register zu vermeiden?

Lokale Variablen sollten unbedingt vermieden werden, wenn es sich dabei um große Array- oder Clusterstrukturen innerhalb der zeitkritschen Hauptausführungs-Schleife handelt. Wenn Du das beachtest, oder anders herum gesagt, wenn Du nur in diesem Fall Shiftregister verwendest, ansonsten aber lokale Variablen, dann bleiben von Deinen 10 oder 20 Schiftregisteren vielleicht nur noch 1 oder 2 übrig, ohne daß es zu messbaren Geschwindigkeitsnachteilen kommt. Ansonsten würde ich, wie von Dir schon erwogen, lokale Variablen verwenden.

Die VI-übergreifenden Globalen oder funktionalen globalen Variablen wird man sowieso nur verwenden, wenn Informationen zwischen unterschiedlichen VIs ausgetauscht werden sollen, und wenn das der Fall ist, stehen sie in Konkurrenz zu Queues oder Meldern als die oftmals bessere Alternative.

In Deinem Vergleich fehlt etwas, was am allerschlechtesten wäre: Wert schreiben oder lesen über Eigenschaftsknoten "Wert". Sollte man nur verwenden, wenn der Aufruf eines Eigenschaftsknotens wegen anderer Eigenschaften sowieso notwendig ist, in diesem Fall kann man anstelle der lokalen Variablen die Eigenschaft "Wert" mit verwenden. Sonst aber nicht.

Viele Grüße
Ludwig