Forum: PC Hard- und Software LabVIEW hohe CPU Auslastung


von A. R. (redegle)


Angehängte Dateien:

Lesenswert?

Hallo,

ich habe in LabVIEW ein Programm geschrieben, welches mir scheinbar 
grundlos eine CPU-Auslastung zwischen 10 und 20 % erzeugt.

Das Programm befindet sich im Anhang. Statt den BOOLs, welche auf FALSE 
stehen sind im realen Programm Bools der Oberfläche, welche jedoch auch 
alle FALSE sind.

Im Prinzip werden alle 10ms 4 casestrukturen nicht ausgeführt. Wie kann 
soetwas die CPU belasten?

Vielen Dank für alle Antworten.

EDIT: In den Datenleitungen oben befinden sich ca 12 MB. Diese sollten 
aber normal nicht neu alloziert werden. In einer anderen Case-Anweisung 
wird auch keine CPU-Last erzeugt.

: Verschoben durch Moderator
von Robert K. (Firma: Projektleiter Medizinsoftware) (robident)


Lesenswert?

Ohne jetzt wieder vom Leder zu ziehen: LabView ist ein Speicher und 
Rechenzeitverschwender, wie ich kaum einen zweiten kenne. Es ist müssig 
darüber zu diskutieren, welcher Hintergrundprozess das nun wieder 
verursacht. Vermutlich hat es mit Deiner APP wenig zu tun.

Kann sein, das Viech pollt irgendwas ab, prüft und aktualisiert die 
timer und die GUI.

Ich empfehle, Labwindows zu nutzen. Einfach den unnützen overhead weg 
und frisches C/CPP eingesetzt.

von A. R. (redegle)


Lesenswert?

>LabView ist ein Speicher und Rechenzeitverschwender, wie ich kaum einen zweiten 
>kenne.

Da stimme ich dir schoneinmal zu!

>Ich empfehle, Labwindows zu nutzen. Einfach den unnützen overhead weg
>und frisches C/CPP eingesetzt.

Es geht gerade darum, LabVIEW einzusetzten, um Einarbeitungszeit zu 
reduzieren. Deswegen kommt das leider nicht in Frage.

>Kann sein, das Viech pollt irgendwas ab, prüft und aktualisiert die
>timer und die GUI.

Hast du eine Idee, wie man rausbekommen könnte, was das Programm genau 
macht? Das darf doch nicht sein, dass ein polling oder ähnliches 10% der 
CPU braucht.

von Uwe (Gast)


Lesenswert?

> Das darf doch nicht sein, dass ein polling oder ähnliches 10% der
> CPU braucht.
Klar deshalb benutzt man ja auch kein polling.

von A. R. (redegle)


Lesenswert?

>> Das darf doch nicht sein, dass ein polling oder ähnliches 10% der
>> CPU braucht.
>Klar deshalb benutzt man ja auch kein polling.

Wo in dem Programm verwende ich polling?

von Morz Kerl (Gast)


Lesenswert?

Naja, die 500 Threads die innerhalb Labviews vor sich hin werkeln 
verbraten diese Zeit.
Ich wuerd das auch  Labview auf die Halde werfen. Sofern man keine 
Treiber fuer komplexe Messgeraete benoetigt, ist es eh unsinnig. 
Brauchst du solche Treiber ?

von A. R. (redegle)


Lesenswert?

>Naja, die 500 Threads die innerhalb Labviews vor sich hin werkeln
>verbraten diese Zeit.

Falsch. Die 500 Threads wenn es so viele sind erzeugen im Task-Manager 
eine Auslastung von 0%.

>Brauchst du solche Treiber ?

Spielt das eine Rolle? Ich habe lediglich gefragt, warum LabVIEW in 
diesem Programm so viel CPU-Auslastung erzeugt. Schon nach meinem 
zweiten Post hätte klar sein müssen, dass ich nicht auf LabVIEW 
verzichten möchte. Ich wollte nicht darüber diskutieren ob LabVIEW die 
beste Lösung ist oder nicht und ja es werden A/D-Wanlder-Karten von 
National Instruments eingesetzt.

Mittlerweile habe ich die Ursache für die hohe Auslastung entdeckt. 
Scheinbar ist es so, dass jede Verzweigung einer Datenleitung in LabVIEW 
im Hintergrund eine neue Allozierung des Speichers erzeugt. Das ist in 
der Aufbaustruktur von LabVIEW begründet muss man aber vorher einmal 
wissen. Diese Allozierung findet auch dann statt, wenn die Daten später 
nicht mehr benötigt werden. Z.B. wenn Sie nur auf eine CASE-Struktur 
geführt werden, die nicht ausgeführt wird.

von Tobias (Gast)


Lesenswert?

Du kannst dir auch eine Referenz auf dein Anzeigelement erzeugen, diese 
dann weiterreichen und nur bei Bedarf in den Casestrukturen über die 
Eigenschaften von der Referenz auf die Werte zugreifen.
Das dürfte dir, wenn deine Case-Fälle in den meisten Fällen false sind, 
eine Menge kopierter Daten sparen.
Kleine Warnung: Die Referenz funktiniert so in etwa wie ein Pointer, mit 
den meisten Vor-und Nachteilen davon.

von chr (Gast)


Lesenswert?

ersetze mal die "Uhr" in deinem Plan durch das "Metronom" und setz wenns 
geht die Zahl auf 20 oder 50.


Grüße

von ff (Gast)


Lesenswert?

Und dann denk über das Konzept der Eventstruktur nach.

von maumau (Gast)


Angehängte Dateien:

Lesenswert?

Es zeigt die Hohe CPU-Auslastung nur, dass LabVIEW in der Lage ist hohe 
Systemresourcen anzufordern. Das bewirkt, dass die While-  Schleife viel 
schneller durchlaufen wird, als bei einem Mikrocontroller. Daher kannst 
Du die Kommtentare "ab in die Tonne" vergessen.
Durch die Verlagerung der Warteschleife wird der Task an den Scheduler 
zurückgegeben. Es ist keine "dumme" Warteschleife, die Systemresourcen 
verbraucht sondern eine Abgabe des Task.
Bitte schreib uns, ob die im Bild angegebene Lösung passt.

von Robert K. (Firma: Projektleiter Medizinsoftware) (robident)


Lesenswert?

maumau schrieb:
> Es zeigt die Hohe CPU-Auslastung nur, dass LabVIEW in der Lage ist hohe
>
> Systemresourcen anzufordern.

Das macht ein altes 16 Bit Programm unter DOS auch, wenn ich es starte -
es rennt und rennt und blockiert den gesamten Rechner

von maumau (Gast)


Lesenswert?

Aber mit der Funktion ("warten") kannst Du in LabVIEW den Task 
zurückzugeben Für andere Programme sind dann Resourcen frei. Bei einer 
Wartezeit von 1ms geht die Systemauslastung auf ca. 1% zurück.
Das war aber bei 16 Bit Systemen in WIN3.11 unmöglich. Das hat der 
Taskmanager bei einer Endlosschleife nicht weitergeschaltet.
Also hat robinet zwar recht mit "läuft und läuft", aber so ist es nicht 
in LabVIEW.

von Tobias (Gast)


Lesenswert?

moep, der Threadersteller antwortet eh nicht mehr
und @maumau - deine Idee würde mal so gar nichts am Programmablauf 
ändern. So viel zu "ab in die Tonne" ;-)

von A. R. (redegle)


Lesenswert?

>Du kannst dir auch eine Referenz auf dein Anzeigelement erzeugen, diese
>dann weiterreichen und nur bei Bedarf in den Casestrukturen über die
>Eigenschaften von der Referenz auf die Werte zugreifen.
>Das dürfte dir, wenn deine Case-Fälle in den meisten Fällen false sind,
>eine Menge kopierter Daten sparen.
>Kleine Warnung: Die Referenz funktiniert so in etwa wie ein Pointer, mit
>den meisten Vor-und Nachteilen davon.

Danke für den Hinweis.

>Durch die Verlagerung der Warteschleife wird der Task an den Scheduler
>zurückgegeben. Es ist keine "dumme" Warteschleife, die Systemresourcen
>verbraucht sondern eine Abgabe des Task.
>Bitte schreib uns, ob die im Bild angegebene Lösung passt.

Danke für den Hinweis. Das werde ich ggf. dem nächst mal Prüfen. Jedoch 
wurde das Problem schon damit gelöst, dass ich Verzweigungen von den 
Datenpfänden vermieden habe. Danach ging die Auslastung auf ca. 0% 
zurück.
Also im angehangenem Bild habe ich statt den rot gekennzeichneten 
Verzweigungen einen Aufbau wie in blau gekennzeichnet verwendet.


>moep, der Threadersteller antwortet eh nicht mehr
>und @maumau - deine Idee würde mal so gar nichts am Programmablauf
>ändern. So viel zu "ab in die Tonne" ;-)

Sorry, für mich war das Problem so weit erledigt und der letzte Beitrag 
den ich gesehen habe war von Tobias am 12.07.2012 um 10:24 Uhr.

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.