05.12.2012, 15:30
Hallo ihr wenigen LVOOP Nutzer *BNT zuwink*,
ich habe ein kleines Problem. Wollte mir ein Interpolationstool erstellen und um Rundungsfehlern / Fehlern bei prüfen auf Gleichheit etc. vorzubeugen habe ich mal eine einheitliche Number Klasse erstellt (dachte mir das wäre auch für andere Dinge ganz praktisch), die zweistufig erst über den allgemeinen Kindtyp Float, Signed und Unsigned auf die tatsächlichen Datentypen (U8,U16 etc. pp) als (Enkel) projiziert.
Initialisiert werden kann die Elternklasse "Number" über einen Variant alternativ jede Kindklasse mit dem korrekten Datentyp (U8 mit nem U8 etc. pp; typischerweise dürfte Initialisieren über Variant praktischer sein).
Soweit zur Architektur.
Jetzt habe ich darauf mal einen simplen Entwurf für Addition nachgebildet (es wird festgestellt ob die Datentypen identisch sind, wenn ja, wird einfach auf niederster Ebene die normale Addition durchgeführt. Aktuell ist das noch rudimentär implementiert, so dass ich die Laufzeit für die Kernfunktion addieren überprüfen kann (aktuell werden beliebige Datentypen für identisch gehalten; aber das stört ja nicht so lange die wirklich identisch sind).
Beim Testen (in der Number Klasse das VI "RuntimeTester") der Laufzeit kam dann der Schock. Mit Performanceeinbußen durch den Overhead (mehr Funktionen drumherum, mehr Speicherbedarf) hatte ich ja gerechnet, aber nach dem Tester zu urteilen liegen die Einbußen bei einem Faktor 1000 langsamer (etwa).
[attachment=42527]
Und das kann ich mir überhaupt nicht erklären (intern macht der: Arrays mit Zahlen und "Number" Objekten Auswürfeln und dann einmal "normal" addieren und einmal mit der Klassenfunktion und gibt dafür die benötigte Zeit aus).
Hab auch schon rumgespielt mit Ablaufinvarianter Ausführung und höherer Priorität, aber von dem Faktor 1000 kommt man nicht wirklich deutlich weg.
Deswegen meine Frage: Produziert das immer so einen drastischen Overhead? Bin eigentlich beim LVOOP programmieren immer davon ausgegangen, dass ich im Zweifel lieber viele VIs mache als weniger, um die Wartbarkeit einzelner Komponenten besser zu gewährleisten. Muss man davon doch Abstand nehmen und nur Komplexe Dinge in Objekte packen? Und sich doch gedanken um den Zeitverbrauch machen... ?
Gruß Kiesch
ich habe ein kleines Problem. Wollte mir ein Interpolationstool erstellen und um Rundungsfehlern / Fehlern bei prüfen auf Gleichheit etc. vorzubeugen habe ich mal eine einheitliche Number Klasse erstellt (dachte mir das wäre auch für andere Dinge ganz praktisch), die zweistufig erst über den allgemeinen Kindtyp Float, Signed und Unsigned auf die tatsächlichen Datentypen (U8,U16 etc. pp) als (Enkel) projiziert.
Initialisiert werden kann die Elternklasse "Number" über einen Variant alternativ jede Kindklasse mit dem korrekten Datentyp (U8 mit nem U8 etc. pp; typischerweise dürfte Initialisieren über Variant praktischer sein).
Soweit zur Architektur.
Jetzt habe ich darauf mal einen simplen Entwurf für Addition nachgebildet (es wird festgestellt ob die Datentypen identisch sind, wenn ja, wird einfach auf niederster Ebene die normale Addition durchgeführt. Aktuell ist das noch rudimentär implementiert, so dass ich die Laufzeit für die Kernfunktion addieren überprüfen kann (aktuell werden beliebige Datentypen für identisch gehalten; aber das stört ja nicht so lange die wirklich identisch sind).
Beim Testen (in der Number Klasse das VI "RuntimeTester") der Laufzeit kam dann der Schock. Mit Performanceeinbußen durch den Overhead (mehr Funktionen drumherum, mehr Speicherbedarf) hatte ich ja gerechnet, aber nach dem Tester zu urteilen liegen die Einbußen bei einem Faktor 1000 langsamer (etwa).
[attachment=42527]
Und das kann ich mir überhaupt nicht erklären (intern macht der: Arrays mit Zahlen und "Number" Objekten Auswürfeln und dann einmal "normal" addieren und einmal mit der Klassenfunktion und gibt dafür die benötigte Zeit aus).
Hab auch schon rumgespielt mit Ablaufinvarianter Ausführung und höherer Priorität, aber von dem Faktor 1000 kommt man nicht wirklich deutlich weg.
Deswegen meine Frage: Produziert das immer so einen drastischen Overhead? Bin eigentlich beim LVOOP programmieren immer davon ausgegangen, dass ich im Zweifel lieber viele VIs mache als weniger, um die Wartbarkeit einzelner Komponenten besser zu gewährleisten. Muss man davon doch Abstand nehmen und nur Komplexe Dinge in Objekte packen? Und sich doch gedanken um den Zeitverbrauch machen... ?
Gruß Kiesch