13.02.2011, 18:28
Hallo,
ich habe in LabView 8.2 ein VI geschrieben, welches einen Teil eines Arrays glättet. Man übergibt also das Array, einen Startindex und eine Länge und das VI gibt das Array zurück, wobei eben der angegebene Bereich geglättet ist.
Intern läuft es so, daß aus dem Eingangs-Array der zu glättende Teil extrahiert wird (Sub-Array) und am Schluss mit Replace Array Subset die ursprünglichen Daten durch die neuen Daten ersetzt werden.
Nun ist mir aufgefallen, daß das VI extrem langsam wird, wenn das zu übergebende Array lang wird. Dabei sollte die Länge des Arrays für die Rechenzeit keine Rolle spielen! Denn von Interesse für den Algortihmus ist nur die Länge des zu glättenden Intervalls, und die ist in diesem Fall konstant und gering (einige Messpunkte).
Ich habe mir daraufhin alle Buffer-Allocationen anzeigen lassen und habe bemerkt, daß scheinbar beim Übergeben des Arrays ins VI ein Buffer alloziert wird (siehe Anhang). Da das Array einige Millionen Messpunkte enthalten kann, kann dies Speicher- und Geschwindigkeitsprobleme mit sich bringen. Alle anderen Allocationen haben nur die Länge des zu glättenden Intervalls (einige Messpunkte) und sind somit nicht kritisch!
Ich wollte nun fragen, ob es bei Labview Standart ist, daß von Arrays bei der Übergabe an (Sub-)VIs Kopien angelegt werden. Ich kenne das aus den Standart-Programmiersprachen so, daß Arrays immer per Referenz übergeben werden. Lässt sich das in LabView 8.2 auch irgendwie realisieren? Gibt es da irgendwo eine Option im Compiler oder bei den VI-Einstellungen?
Zur Not kann ich zwar einen Workaround machen, indem ich nur den zu glättenden Teil an das VI übergebe (ich habe das schon probiert, es ist deutlich schneller), doch irgendwie möchte ich mich nicht damit abfinden, daß jedes VI Kopien der Arrays anlegt.
Danke für die Antworten!!!
Thomas
ich habe in LabView 8.2 ein VI geschrieben, welches einen Teil eines Arrays glättet. Man übergibt also das Array, einen Startindex und eine Länge und das VI gibt das Array zurück, wobei eben der angegebene Bereich geglättet ist.
Intern läuft es so, daß aus dem Eingangs-Array der zu glättende Teil extrahiert wird (Sub-Array) und am Schluss mit Replace Array Subset die ursprünglichen Daten durch die neuen Daten ersetzt werden.
Nun ist mir aufgefallen, daß das VI extrem langsam wird, wenn das zu übergebende Array lang wird. Dabei sollte die Länge des Arrays für die Rechenzeit keine Rolle spielen! Denn von Interesse für den Algortihmus ist nur die Länge des zu glättenden Intervalls, und die ist in diesem Fall konstant und gering (einige Messpunkte).
Ich habe mir daraufhin alle Buffer-Allocationen anzeigen lassen und habe bemerkt, daß scheinbar beim Übergeben des Arrays ins VI ein Buffer alloziert wird (siehe Anhang). Da das Array einige Millionen Messpunkte enthalten kann, kann dies Speicher- und Geschwindigkeitsprobleme mit sich bringen. Alle anderen Allocationen haben nur die Länge des zu glättenden Intervalls (einige Messpunkte) und sind somit nicht kritisch!
Ich wollte nun fragen, ob es bei Labview Standart ist, daß von Arrays bei der Übergabe an (Sub-)VIs Kopien angelegt werden. Ich kenne das aus den Standart-Programmiersprachen so, daß Arrays immer per Referenz übergeben werden. Lässt sich das in LabView 8.2 auch irgendwie realisieren? Gibt es da irgendwo eine Option im Compiler oder bei den VI-Einstellungen?
Zur Not kann ich zwar einen Workaround machen, indem ich nur den zu glättenden Teil an das VI übergebe (ich habe das schon probiert, es ist deutlich schneller), doch irgendwie möchte ich mich nicht damit abfinden, daß jedes VI Kopien der Arrays anlegt.
Danke für die Antworten!!!
Thomas