LabVIEWForum.de - Code / Laufzeitoptimierung

LabVIEWForum.de

Normale Version: Code / Laufzeitoptimierung
Du siehst gerade eine vereinfachte Darstellung unserer Inhalte. Normale Ansicht mit richtiger Formatierung.
Hallo zusammen,

Ich habe ein LV-Programm geschrieben, bei welchem die Funktionalität auch vorhanden ist. Jedoch dauert die Ausführung sehr lange.
Darum würde ich die Teilaufgabe hier gerne vorstellen und fragen, wer für mich Tips hätte um den Code demenstpechend anzupassen, dass die Laufzeit verkürzt wird.

Ausgangslage:
Ich bekomme XML-Dateien, in welchen meine Daten in der Hex-Schreibweise als UTF-8 codiert sind. Die XML-Dateien werden dann ca. 4 MB groß sein und somit über 4 mio HEX-Zeichen enthalten.

Das sieht dann als String so aus:
Code:
2EF4C59F 2EF4C5BF 2EF4C5DF 2EF4C5FF 2EF4C61F 2EF4C63F 2EF4C65F

Dieser String soll dann wie folgt Interpretiert werden:
Code:
0010 = 2
1110 = E
1111 = F
0100 = 4
...

Es gehören immer 8 Zeichen zu einem Block zwischen zwei Leerzeichen zusammen. Ist die Zeichenkette kürzer wie 8 Zeichen muss dementsprechen mit führenden 0-len aufgefüllt werden.

Ziel
Das Ziel der Umwandlung ist der Datentyp Waveform mit U8 als Daten. Die Daten bestehen lediglich aus der Folge von 0ern bzw. 1ern (0010111011110100..). Danach erfoglt dann die eigeneliche Verarbeitung der Daten.

Folgender Code von mir erfüllt bereits seine Aufage:

[Bild: attachment.php?aid=61312]


Aktuell fehlt mir jedoch ein Ansatz, um den Code effektiver zu gestalten.
Würde mich freuen, wenn ich den ein oder anderen Tip von euch bekommen könnte.

Vielen Dank

Viele Grüße
Christoph
Wieso wandelst du nicht in eine Digital Waveform?

Eine (max. Achterpaket Buchstaben) kannst du auch so wandeln:
[attachment=61314]
Dein Auffüllen kannst du dir damit schenken.

Gruß, Jens
Das geht auch einfacher:
[attachment=61315]
Ich habe 2 kürzere Blöcke zum Testen eingefügt.
(28.09.2020 14:24 )th13 schrieb: [ -> ]Das geht auch einfacher:

Ich habe 2 kürzere Blöcke zum Testen eingefügt.

Top1

Gruß, Jens
@th13:
Das geht noch einfacher:
[attachment=61316]
Big Grin
(28.09.2020 17:23 )GerdW schrieb: [ -> ]@th13:
Das geht noch einfacher:
Sehr schön.

(28.09.2020 12:16 )tuhpon schrieb: [ -> ]Jedoch dauert die Ausführung sehr lange.
Mit dem Code von Gerd dauert das Einlesen einer 4 MB großen Textdatei (66700 mal den Beispielstring) auf meinem Rechner ca. 740 ms. Deinen Code habe ich nicht nachgebaut und kann daher nicht vergleichen. Daher die Frage: schnell genug?
Hallo Zusammen,

vielen Dank für eure allen Unterstützung.

Die Lösung von GerdW hat bei mir einen Mega Geschwindigkeitsvorteil gebraucht. Smile
Danke an th13 fürs Testen. Smile

Ich werde mir beide Lösungen nochmal anschauen und drüber nachdenken, was den Unterschied zu meinem macht Big Grin

Viele Grüße

Christoph
(29.09.2020 11:55 )tuhpon schrieb: [ -> ]Ich werde mir beide Lösungen nochmal anschauen und drüber nachdenken, was den Unterschied zu meinem macht Big Grin

Hauptsächlich wird das die FOR-Loop sein, die den Geschwindigkeits-Vorteil gegenüber deiner Lösung bringt.
LabVIEW kann hier schon vorher die Größe des Ausgangs-Arrays bestimmen und entsprechend Speicher vorab allozieren.
Bei deiner Shift-Register Variante inkl. "Insert-Into-Array" muss LabVIEW immer wieder Speicher allozieren - das kostet Zeit.

Dann sind es insgesamt viel weniger Schleifen-Durchläufe, deine For + While-Loop geht durch jeden Buchstaben des Eingangsstrings, die anderen Vorschläge fassen immer gleich die 8er-Blöcke zu einer U32-Zahl zusammen.

LabVIEW-Funktionen, die auf ein Array angewendet werden, sind in der Regel ebenfalls deutlich schneller als das in Einzelaufrufen nachzuprogrammieren.

Gruß, Jens
Referenz-URLs