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 

warum ist die Globale Variable schneller?



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!

09.03.2011, 10:11
Beitrag #21

macmarvin Offline
CLA
***


Beiträge: 445
Registriert seit: Sep 2006

2014
2004
EN

81373
Deutschland
RE: warum ist die Globale Variable schneller?
Danke für den weiteren Test... anbei nur ein kleiner Fix für den Speedtest... sonst läuft der Speicher so schnell voll Wink

2010 .vi  speedtest2_fixed.vi (Größe: 19,82 KB / Downloads: 171)
LV2010
Alle Beiträge dieses Benutzers finden
Diese Nachricht in einer Antwort zitieren to top
09.03.2011, 11:50
Beitrag #22

IchSelbst Offline
LVF-Guru
*****


Beiträge: 3.689
Registriert seit: Feb 2005

11, 14, 15, 17, 18
-
DE

97437
Deutschland
RE: warum ist die Globale Variable schneller?
Und wer genau nachforscht stellt fest, dass alles nur daran liegt, dass in dem einen Falle "Daten samt Pointer" kopiert werden und im anderen nicht. Schreib mal in den String was anständiges rein und miss dann noch mal die Zeit.

Jeder, der zur wahren Erkenntnis hindurchdringen will, muss den Berg Schwierigkeit alleine erklimmen (Helen Keller).
Alle Beiträge dieses Benutzers finden
Diese Nachricht in einer Antwort zitieren to top
09.03.2011, 14:21
Beitrag #23

macmarvin Offline
CLA
***


Beiträge: 445
Registriert seit: Sep 2006

2014
2004
EN

81373
Deutschland
RE: warum ist die Globale Variable schneller?
Ich versteh's nicht... mit befülltem String komme ich auf:
   


2010 .vi  speedtest2_fixed_filled_string.vi (Größe: 20,65 KB / Downloads: 155)
lv2010

Poste doch mal bitte deine Version.
Alle Beiträge dieses Benutzers finden
Diese Nachricht in einer Antwort zitieren to top
09.03.2011, 18:12
Beitrag #24

IchSelbst Offline
LVF-Guru
*****


Beiträge: 3.689
Registriert seit: Feb 2005

11, 14, 15, 17, 18
-
DE

97437
Deutschland
RE: warum ist die Globale Variable schneller?
Spielerei:

Ist der String im Cluster leer, dauer die ganze Sache mit der lokalen Variablen 10ms. Steht ein einziges Zeichen im String, dauert die Sache plötzlich 20ms. Genau so lange dauern auch 4 Zeichen im String. 32 Zeichen dauern ungefähr 25ms.

Wo kommt der Sprung von 10ms auf 20ms her?

Ich tippe auf folgendes:
Beim Auslesen der Lokalen Variablen wird für das komplette Array neuer Speicher angefordert. In diesen Speicher wird das Array kopiert. Beachte: Wenn der String leer ist, steht im Cluster für den String ein Null-Pointer. Ob LV das genau so macht, weis ich natürlich nicht. Es ist aber extrem sinnvoll: Null-Pointer bedürfen nämlich keiner weiteren Operation.
Steht im String ein einzelnes Zeichen, so muss für den String, der jetzt nicht mehr leer ist, zusätzlich ein Speicher angefordert werden (das haben Strings so an sich). In diesen Speicher wird dann der Stringinhalt (also die Daten) kopiert. Und dieses Speicher-Anfordern alleine dauert die 10ms. Und da ist noch nix mit Daten kopieren dabei.
Das kopieren der 32 Zeichen summiert sich dann halt auf 5 zusätzliche Millisekunden.

Was will ich jetzt damit sagen? Zwei Sachen:

Je komplizierter der Cluster um so aufwändiger die Speicherbereitstellung und das kopieren.

Viel wichtiger hier ist aber folgendes:
Bei Verwendung einer lokalen Variablen müssen die Daten kopiert werden. Einen Pointer auf die Daten in der Lokalen Variablen zu verwenden geht nicht. Es besteht nämlich die Möglichkeit, dass ein paralleler Prozess auch auf die Daten der Lokalen Variablen zugreifen will. Ein zweifacher Pointer-Zugriff aber ist tödlich.
Verwendet man eine Queue, sieht die Sache ganz anders aus: Beim Auslesen der Queue muss man keine Daten kopieren! Da kann man den Bereich nehmen, der bereits vorhanden ist: Es gibt nichts in irgendwelchen parallelen Prozessen, das auch auf die Daten in der Queue zugreifen kann: einmal ausgelesen, sind die Daten nicht mehr "da". Warum also kopieren?


Hinweis:
Ob LV das auch genau so macht, wie ich es mir vorstelle, weis ich nicht. Da gibt es andere. Es spricht nur sehr, sehr viel dafür.


Angehängte Datei(en)
2010 .vi  speedtest2_fixed_filled_string.vi (Größe: 20,03 KB / Downloads: 129)

Jeder, der zur wahren Erkenntnis hindurchdringen will, muss den Berg Schwierigkeit alleine erklimmen (Helen Keller).
Alle Beiträge dieses Benutzers finden
Diese Nachricht in einer Antwort zitieren to top
09.03.2011, 19:16 (Dieser Beitrag wurde zuletzt bearbeitet: 09.03.2011 19:17 von Lucki.)
Beitrag #25

Lucki Offline
Tech.Exp.2.Klasse
LVF-Team

Beiträge: 7.699
Registriert seit: Mar 2006

LV 2016-18 prof.
1995
DE

01108
Deutschland
RE: warum ist die Globale Variable schneller?
Mein Untersuchungen lassen vermuten, daß der gesamte Zeitverbrauch einzig und allein durch das Lesen und Beschreiben der Anzeigen zustandekommt.
Queue: Kein Lesen und Schreiben von Anzeigen --> kein Zeitverbrauch
Globale Variable: Lesen und Beschreiben der Anzeige im Global-VI
Lokale Variable: Lesen und Beschreiben der Anzeige im Main-VI

Werden keine Anzeigen gelesen/geschrieben, wird auch keine nennenswerte Zeit gebraucht. Die Arrayoperationen, obwohl hier sicherlich Kopien angelegt werden müssen, sind es jedenfalls nicht, die Zeit verbrauchen.
   

2010 .vi  speedtest3_fixed_filled_string.vi (Größe: 19,74 KB / Downloads: 157)
Alle Beiträge dieses Benutzers finden
Diese Nachricht in einer Antwort zitieren to top
09.03.2011, 20:59 (Dieser Beitrag wurde zuletzt bearbeitet: 09.03.2011 21:00 von Falk.)
Beitrag #26

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


Beiträge: 343
Registriert seit: Jan 2006

8.0 :: 201x ::202x
2006
DE_EN


Deutschland
RE: warum ist die Globale Variable schneller?
(09.03.2011 18:12 )IchSelbst schrieb:  Ich tippe auf folgendes:
Beim Auslesen der Lokalen Variablen wird für das komplette Array neuer Speicher angefordert. In diesen Speicher wird das Array kopiert. Beachte: Wenn der String leer ist, steht im Cluster für den String ein Null-Pointer. Ob LV das genau so macht, weis ich natürlich nicht. Es ist aber extrem sinnvoll: Null-Pointer bedürfen nämlich keiner weiteren Operation.
Steht im String ein einzelnes Zeichen, so muss für den String, der jetzt nicht mehr leer ist, zusätzlich ein Speicher angefordert werden (das haben Strings so an sich). In diesen Speicher wird dann der Stringinhalt (also die Daten) kopiert. Und dieses Speicher-Anfordern alleine dauert die 10ms. Und da ist noch nix mit Daten kopieren dabei.

So abwegig scheint dies auch nicht zu sein:
Code:
http://zone.ni.com/reference/en-XX/help/371361G-01/lvconcepts/how_labview_stores_data_in_memory/

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
Anzeige
09.03.2011, 21:07
Beitrag #27

IchSelbst Offline
LVF-Guru
*****


Beiträge: 3.689
Registriert seit: Feb 2005

11, 14, 15, 17, 18
-
DE

97437
Deutschland
RE: warum ist die Globale Variable schneller?
(09.03.2011 19:16 )Lucki schrieb:  daß der gesamte Zeitverbrauch einzig und allein durch das Lesen und Beschreiben der Anzeigen zustandekommt.
Guckst du neues Muster. Da ist der Case mit der Queue doch tatsächlich ein ganz klein, klein bisschen langsamer: Ohne Anzeigeelement, nur kopieren.

Ja, und natürlich kommt die Zeit vom "Auslesen des Anzeigeelementes". Hier wird kopiert. Die Array-Operationen selbst sind natürlich schnell. Die selbst arbeiten mit einem Pointer, der in den eingehenden Datenfluss zeigt. Kopiert wird immer nur am Knoten (und wenn's ein fiktiver ist wie beim Lesen des Anzeigeelementes) bzw. an der Verzweigung im Datenfluss.


Angehängte Datei(en)
2010 .vi  speedtest2_fixed_filled_string.vi (Größe: 21,12 KB / Downloads: 144)

Jeder, der zur wahren Erkenntnis hindurchdringen will, muss den Berg Schwierigkeit alleine erklimmen (Helen Keller).
Alle Beiträge dieses Benutzers finden
Diese Nachricht in einer Antwort zitieren to top
10.03.2011, 09:58
Beitrag #28

macmarvin Offline
CLA
***


Beiträge: 445
Registriert seit: Sep 2006

2014
2004
EN

81373
Deutschland
RE: warum ist die Globale Variable schneller?
(09.03.2011 11:50 )IchSelbst schrieb:  Und wer genau nachforscht stellt fest, dass alles nur daran liegt, dass in dem einen Falle "Daten samt Pointer" kopiert werden und im anderen nicht. Schreib mal in den String was anständiges rein und miss dann noch mal die Zeit.

Puh... und ich dachte schon, du hast einen Fall gefunden in dem mehr Daten kopieren schneller geht als weniger. Smile

Variablen _müssen_ die Daten kopieren.
Queues _können_ Daten kopieren, bei richtiger Verwendung tun sie es aber nicht (ggf. selbst wenn eine Buffer allocation angezeigt wird!).
Alle Beiträge dieses Benutzers finden
Diese Nachricht in einer Antwort zitieren to top
Antwort schreiben 


Möglicherweise verwandte Themen...
Themen Verfasser Antworten Views Letzter Beitrag
  Globale Variablen Edi70 7 4.396 08.10.2021 17:01
Letzter Beitrag: GerdW
  Boolean als globale Variable ares2013 12 11.281 06.09.2019 13:57
Letzter Beitrag: GerdW
  Übergabe Anzeigeelement zwischen VIs (Referenz/globale Variable?) lipster 1 4.279 03.02.2017 14:27
Letzter Beitrag: GerdW
  Warum ertönt ein BING Hasenfuss 3 3.251 07.07.2015 20:20
Letzter Beitrag: jg
  Frage zur Compilierung, ist .EXE schneller als Start vom Frontpanel? Hasenfuss 1 2.793 30.06.2015 14:51
Letzter Beitrag: jg
  globale Konstanten? Nordvestlys 6 5.879 20.02.2015 09:35
Letzter Beitrag: Nordvestlys

Gehe zu: