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!
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).
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.
Jeder, der zur wahren Erkenntnis hindurchdringen will, muss den Berg Schwierigkeit alleine erklimmen (Helen Keller).
09.03.2011, 19:16 (Dieser Beitrag wurde zuletzt bearbeitet: 09.03.2011 19:17 von Lucki.)
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.
(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.
(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.
Jeder, der zur wahren Erkenntnis hindurchdringen will, muss den Berg Schwierigkeit alleine erklimmen (Helen Keller).
(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.
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!).