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 

Dieses Thema hat akzeptierte Lösungen:

Melder Performance



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!

05.09.2014, 21:49
Beitrag #1

D_Sev Offline
LVF-Gelegenheitsschreiber
**


Beiträge: 56
Registriert seit: Nov 2013

2012
2011
DE_EN


Deutschland
Melder Performance
Moin zusammen,

ich habe gehört, dass das häufige Erstellen und Zerstören von Meldern zwecks synchroner Kommunikation nicht sehr performant sein soll.
Statt dessen solle man lieber einen Vorrat an Meldern anlegen und aus diesem Fundus schöpfen. Ich kann das nicht so recht glauben und wollte deshalb einmal einen Performance-Vergleich anstellen.

Aber nach müde kommt doof und ich bin grade nicht in der Lage den Fehler in meinem VI zu finden.
Wähle ich die Variante mit der FGV aus, können Nachrichten zu den falschen Schleife gelangen und es entsteht ein Fehler. Debuggen kann ichs nicht so richtig. Lege ich eine Probe an einem Melder an, verändere ich die Geschwindigkeit so, dass der Fehler nicht mehr auftritt.

Vielleicht kann mir jemand meinen Denkfehler aufzeigen.


Angehängte Datei(en)
12.0 .vi  Main.vi (Größe: 75,96 KB / Downloads: 229)

12.0 .vi  Notifier FGV.vi (Größe: 15,93 KB / Downloads: 243)
Alle Beiträge dieses Benutzers finden
Diese Nachricht in einer Antwort zitieren to top
Anzeige
06.09.2014, 08:43
Beitrag #2

D_Sev Offline
LVF-Gelegenheitsschreiber
**


Beiträge: 56
Registriert seit: Nov 2013

2012
2011
DE_EN


Deutschland
RE: Melder Performance
LabVIEW 2011


Angehängte Datei(en)
11.0 .vi  Main.vi (Größe: 41,81 KB / Downloads: 209)

11.0 .vi  Notifier FGV.vi (Größe: 20,86 KB / Downloads: 194)
Alle Beiträge dieses Benutzers finden
Diese Nachricht in einer Antwort zitieren to top
06.09.2014, 09:45 (Dieser Beitrag wurde zuletzt bearbeitet: 06.09.2014 09:55 von GerdW.)
Beitrag #3

GerdW Offline
______________
LVF-Team

Beiträge: 17.480
Registriert seit: May 2009

LV2021
1995
DE_EN

10×××
Deutschland
RE: Melder Performance
Hallo Sev,

Anmerkungen zur FGV:
- Im Case "Get Notifier" suchst du anscheinend nach einem bisher unbenutzten Notifier. Da ist aber kein Fehlerhandling, falls keine freier Notifier gefunden wurde! Noch schlimmer: welcher Notifier wird in eben diesem Fall gewählt, wenn die Search1DArray-Funktion ein "-1" ausgibt?
- Zweites Problem mit der FGV: die FGV blockiert gleichzeitige Aufrufe, das ist ihr primärer Einsatzzweck. Bei deinem MainVI führt dies aber dazu das sich alle Schleifen gegenseitig ausbremsen: Andauernd und ungebremst wird versucht, auf die FGV zuzugreifen…
- Bist du dir in deiner Testroutine sicher, dass deine Testschleifen wirklich ein Signal ihres Notifiers erhalten? Wird genau dieser Notifier wirklich beschrieben? Wenn ich das mit ganz normalem Debugging mit Sonden überprüfe, bekomme ich da ganz komische Resultate…

Allgemeine Anmerkungen:
Ich glaube, das ganze Gestrüpp ließe sich deutlich lichten, wenn du deine Notifier "benamsen" würdest!
Man kann jedem Notifier/jeder Queue einen Namen zuweisen. Damit ist für alle an der Kommunikation beteiligten Parteien der Notifier/die Queue bekannt und jede Partei öffnet für sich einmal eine Referenz und schließt diese einmal ganz am Ende.
Wozu also dieses andauernde Öffnen/Schließen oder gar fehlerhafte Verwalten in einer FGV? Hmm

P.S.: Das AutoCleanup-Tool hätte zumindest bei der FGV auch nicht geschadet…

Alle Beiträge dieses Benutzers finden
Diese Nachricht in einer Antwort zitieren to top
06.09.2014, 10:38 (Dieser Beitrag wurde zuletzt bearbeitet: 06.09.2014 10:45 von jg.)
Beitrag #4

jg Offline
CLA & CLED
LVF-Team

Beiträge: 15.864
Registriert seit: Jun 2005

20xx / 8.x
1999
EN

Franken...
Deutschland
RE: Melder Performance

Akzeptierte Lösung

Dein VI ist ein schönes Beispiel dafür, wieso ich persönlich nach Jahren LabVIEW immer noch nicht richtig warm werde mit Notifiern.

Problem ist, dass du eigentlich eine 1-zu-1 Kommunikation brauchst, der Notifier aber eine 1-zu-N Kommunikation liefert.

Fangen wir bei der Obtain/Destroy Variante an:
Durch das dauernde Erstellen eines neuen Notifiers, den du jeweils nach einmaliger Verwendung wieder zerstörst, stellst du "manuell" die 1-zu-1 Kommunikation sicher. Die jeweils zweite Schleife rechts meldet immer genau an den Aufrufer zurück, und danach ist der Notifier weg. Es kann also nichts schief gehen.
Das Ganze würde natürlich genauso sicher funktionieren, wenn du die Notifier jeweils vor der Schleife nur 1x erzeugst:
   

Jetzt zur FGV-Variante:
Erster (kleiner) Fehler: In der untersten For-Schleife ist die Notifier-Refnum nicht weitergegeben.

Das ist aber nicht das Haupt-Problem, wieso diese Variante nicht wie gedacht funktioniert. Das eigentliche Problem ist hier die 1-zu-N Funktionalität des Notifiers. Ich skizziere das mal an Hand von 2 Prozessen. Es könnte Folgendes passieren:
Prozess 1 holt sich die Refnum von Notifier 1 aus dem FGV. Diese gibt sie per Queue an den Parallel-Prozess 1 weiter und wartet jetzt auf eine Meldung. Der Parallel-Prozess 1 sendet diese Meldung dann irgendwann, und es geht in Schleife 1 weiter, die Refnum wird wieder freigegeben.
Prozess 2 wird erst jetzt gestartet (ist ja alles parallel programmiert), holt sich jetzt ebenfalls die Refnum von Notifier 1 (der ist ja wieder frei verfügbar), gibt sie an den Parallel-Prozess 2 weiter, und startet ein "Wait on Notification". Und hier kann es schon schief gehen. Ein "Wait on Notification" wartet nicht ab Aufruf auf eine neue Meldung, sondern wartet pro Instanz auf eine Meldung. Diese Instanz hat die Meldung aus Prozess 1 aber noch nicht ausgelesen, das ist für diese Instanz also eine neue Meldung. Sie wird somit ausgewertet und schon hast du einen Fehler.
Jetzt könntest du probieren, das Ganze mit einem "True" am Eingang "Ignore Previous" am Eingang von "Wait on Notification" zu umgehen. Somit würde Prozess 2 zumindest nicht die Notification von Prozess 1 auswerten. Das funktioniert aber auch nicht sauber, denn auf Grund des Multi-Threading von LabVIEW könnte jetzt Folgendes passieren:
- Prozess 2 holt sich Notifer 1 und gibt ihn per Queue weiter.
- Der Parallel-Prozess 2 liest Notifer 1 aus und sendet sofort die Meldung.
- Erst jetzt startet Prozess 1 das "Wait on Notification", wegen "Ignore previous" erhält er aber gar keine Meldung.
Folge: Stillstand.

Mögliche Lösung für die FGV-Variante: Umstieg auf 1-Element Queues anstatt des Notifiers. Denn dann hast du wieder eine saubere 1-zu-1 Kommunikation.

--

Und dann noch zu deinem "ich habe gehört": Keine Ahnung, woher du das hast, ich kenne nur den Hinweis aus der Hilfe, der sich aber auf den Speicheranstieg bei "Obtain Notifier" bezieht:
Zitat:If you use the Obtain Notifier function to return a reference to a named notifier inside a loop, LabVIEW creates a new reference to the named notifier each time the loop iterates. If you use Obtain Notifier in a tight loop, LabVIEW slowly increases how much memory it uses because each new reference uses an additional four bytes. These bytes are released automatically when the VI stops running. However, in a long-running application it may appear as if LabVIEW is leaking memory since the memory usage keeps increasing. To prevent this unintended memory allocation, use the Release Notifier function in the loop to release the notifier reference for each iteration.

Also eigentlich ganz was anderes.

Die FGV-Variante wird übrigens durch die "Shared Resource" FGV immer langsamer sein...

Gruß, Jens

--

Edit: "Moin zusammen" um 11 Uhr nachts... Big Grin
(06.09.2014 09:45 )GerdW schrieb:  P.S.: Das AutoCleanup-Tool hätte zumindest bei der FGV auch nicht geschadet…
Hmm, die 2012-Variante vom FGV sieht IMHO schön aus, die 2011er habe ich mir nicht angeschaut. Kein Bedarf AutoCleanUp.

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
06.09.2014, 11:20 (Dieser Beitrag wurde zuletzt bearbeitet: 06.09.2014 11:22 von jg.)
Beitrag #5

jg Offline
CLA & CLED
LVF-Team

Beiträge: 15.864
Registriert seit: Jun 2005

20xx / 8.x
1999
EN

Franken...
Deutschland
RE: Melder Performance
Hier ein kleines VI, das die "Memory-Funktion" des Notifiers verdeutlicht: Obwohl 4x "Wait On Notification" verwendet wird, läuft das VI ganz normal durch.
   
Und anbei die VIs, umgebaut auf Queue anstatt Notifier. Geht jetzt ohne Probleme.
@GerdW:
(06.09.2014 09:45 )GerdW schrieb:  Anmerkungen zur FGV:
- Im Case "Get Notifier" suchst du anscheinend nach einem bisher unbenutzten Notifier. Da ist aber kein Fehlerhandling, falls keine freier Notifier gefunden wurde! Noch schlimmer: welcher Notifier wird in eben diesem Fall gewählt, wenn die Search1DArray-Funktion ein "-1" ausgibt?
Prinzipiell hast du Recht, praktisch werden in dem Beispiel aber max. 7 Notifier-Refnums parallel gebraucht.

Gruß, Jens


Angehängte Datei(en)
11.0 .vi  Main.vi (Größe: 42,63 KB / Downloads: 232)

11.0 .vi  Notifier FGV.vi (Größe: 21,16 KB / Downloads: 207)

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
06.09.2014, 11:48 (Dieser Beitrag wurde zuletzt bearbeitet: 06.09.2014 11:56 von D_Sev.)
Beitrag #6

D_Sev Offline
LVF-Gelegenheitsschreiber
**


Beiträge: 56
Registriert seit: Nov 2013

2012
2011
DE_EN


Deutschland
RE: Melder Performance
(06.09.2014 09:45 )GerdW schrieb:  - Im Case "Get Notifier" suchst du anscheinend nach einem bisher unbenutzten Notifier. Da ist aber kein Fehlerhandling, falls keine freier Notifier gefunden wurde! Noch schlimmer: welcher Notifier wird in eben diesem Fall gewählt, wenn die Search1DArray-Funktion ein "-1" ausgibt?

Stimmt, aber da ich nur "kurz" einen Performance-Test machen wollte, habe ich einfach mal zur Sicherheit mehr Melder erstellt als in Gebrauch sein können.


(06.09.2014 09:45 )GerdW schrieb:  - Zweites Problem mit der FGV: die FGV blockiert gleichzeitige Aufrufe, das ist ihr primärer Einsatzzweck. Bei deinem MainVI führt dies aber dazu das sich alle Schleifen gegenseitig ausbremsen: Andauernd und ungebremst wird versucht, auf die FGV zuzugreifen…

Genau deshalb war/bin ich auch skeptisch, das ich auf diese Weise einen Performance-Vorteil erreichen könnte.


(06.09.2014 10:38 )jg schrieb:  Und dann noch zu deinem "ich habe gehört": Keine Ahnung, woher du das hast, ich kenne nur den Hinweis aus der Hilfe, der sich aber auf den Speicheranstieg bei "Obtain Notifier" bezieht:
Nur Hörensagen Big Grin

Danke für die fundierte Antwort. Macht natürlich alles Sinn.


(06.09.2014 11:20 )jg schrieb:  Und anbei die VIs, umgebaut auf Queue anstatt Notifier. Geht jetzt ohne Probleme.

Und Tadaa..ein satter Performance Gewinn von -100% Flop
Alle Beiträge dieses Benutzers finden
Diese Nachricht in einer Antwort zitieren to top
Anzeige
06.09.2014, 12:07 (Dieser Beitrag wurde zuletzt bearbeitet: 06.09.2014 12:11 von jg.)
Beitrag #7

jg Offline
CLA & CLED
LVF-Team

Beiträge: 15.864
Registriert seit: Jun 2005

20xx / 8.x
1999
EN

Franken...
Deutschland
RE: Melder Performance
(06.09.2014 11:48 )D_Sev schrieb:  Und Tadaa..ein satter Performance Gewinn von -100% Flop
Aber genau hingeschaut, der Obtain/Destroy Fall erzeugt in meinem VI die Queues nur 1x VOR der Schleife. Gerade das bringt Performance - und führt (hoffentlich) zu weniger Speicherfragmentierung als dauerndes Neu-Erstellen.

Gruß, Jens

EDIT: Wenn ich Obtain/Destroy wieder in die Schleife mit reinnehme, dann ist die FGV-Variante trotz Shared Resource wieder schneller!!!

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
06.09.2014, 12:40 (Dieser Beitrag wurde zuletzt bearbeitet: 06.09.2014 12:49 von D_Sev.)
Beitrag #8

D_Sev Offline
LVF-Gelegenheitsschreiber
**


Beiträge: 56
Registriert seit: Nov 2013

2012
2011
DE_EN


Deutschland
RE: Melder Performance
Hmm,

und das mit dem Ausgliedern vor die Schleife, kann ich auch nicht für alle meine Anwendungen so nutzen.

Ich habe z.B eine Messenger-VI, welches es mir ermöglichen soll, von überall aus Nachrichten an einen Prozess X zu schicken. Dabei kann man frei wählen, ob auf eine Antwort gewartet werden soll oder nicht. In diesem Fall seh ich keine einfache Möglichkeit das auszugliedern.


Und im Beipiel bestand die Notification jetzt nur aus einem String. Ich denke, wenn man den Datentyp komplexer anlegt, steigt der Gewinn durch die FGV-Variante.


Angehängte Datei(en) Thumbnail(s)
   
Alle Beiträge dieses Benutzers finden
Diese Nachricht in einer Antwort zitieren to top
06.09.2014, 14:57
Beitrag #9

jg Offline
CLA & CLED
LVF-Team

Beiträge: 15.864
Registriert seit: Jun 2005

20xx / 8.x
1999
EN

Franken...
Deutschland
RE: Melder Performance
In deinem letzten Screenshot sind benamte Queues und Notifier zu sehen, da trifft dann wieder der Hinweis aus der Hilfe mit dem Speicher"leck" zu. Dort also aufgepasst.

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
06.09.2014, 15:43
Beitrag #10

D_Sev Offline
LVF-Gelegenheitsschreiber
**


Beiträge: 56
Registriert seit: Nov 2013

2012
2011
DE_EN


Deutschland
RE: Melder Performance
Wollte doch nur die Anwendung zeigen bei der es nicht so einfach möglich ist die Erstellung des Melders auszugliedern Big Grin
Nur für den Fall das dort jemand direkt einen besseren Lösungansatz sieht.

Die benamte Queue, die im Prozess ausgelesen wird, wird im Messenger eigentlich nicht erstellt sonder aus einer FGV bezogen(War nur besser für mein Konzeptbild). Der Notifier ist auch im Bild nicht benamt.
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
  Automatisierung mittels QMH und Melder ar7ur8 22 12.501 13.01.2022 13:55
Letzter Beitrag: TpunktN
  Probleme mit Performance (Berechnungen und Grafik) catbull 5 4.721 21.07.2018 10:13
Letzter Beitrag: IchSelbst
  Performance beim Betrieb über WLAN Heber 9 5.978 22.08.2017 14:28
Letzter Beitrag: Heber
  Fehler Melder wladimir s 7 7.833 14.05.2016 15:24
Letzter Beitrag: BNT
  Kommunikation bei mehrfach ausgeführten SubVis (Melder) I3erry 3 4.014 24.06.2015 13:01
Letzter Beitrag: GerdW
  Schleifenkommunikation: Melder und Benutzer-Ereignisse oder lokale Variablen lumaxo 7 6.522 19.03.2015 17:49
Letzter Beitrag: lumaxo

Gehe zu: