Effizienter Programmieren - Druckversion +- LabVIEWForum.de (https://www.labviewforum.de) +-- Forum: LabVIEW (/Forum-LabVIEW) +--- Forum: LabVIEW Allgemein (/Forum-LabVIEW-Allgemein) +--- Thema: Effizienter Programmieren (/Thread-Effizienter-Programmieren) |
Effizienter Programmieren - ChrisSchul - 28.05.2013 16:20 Hallo Forum-Community Mein Name ist Christian und ich bin neu hier. Seit ein paar Tagen lerne ich mit Hilfe der Evaluierungsversion ein wenig LabView, bevor ich dann auf die Messrechner losgelassen werde Ich habe dafür ein ganz nützliches Einführungsskript von Marko Aschoff gefunden und gehe dies Schritt für Schritt mit den Übungen durch. Dort wurde die Aufgabe gestellt ein VI zu programmieren, dass Zufallskoordinaten in einem quadratischen Feld zwischen jeweils +/-1 erstellt, prüft ob diese innerhalb eines Kreises mit dem Radius 1 liegt, die Trefferzahl und die Trefferquote ausgibt und die einzelnen "Schüsse" in einem Graphen visualisiert. Mein VI erfüllt (soweit ich das erkennen kann) alle diese Aufgaben. Kommt mir aber noch ein wenig zu umfangreich vor. Vor allem irritiert mich die hohe Rechendauer. Schon bei kleinen Werten (100-1000) kommt es mir zu langsam vor. Beim Wert 10000 konnte ich mir fast noch einen Kaffee holen. Beim Pausieren stellte ich fest, dass es am längsten im zweiten Teil der Sequenz braucht. Daher kurz eine Erläuterung, was eigentlich da alles passiert. Zuerst werden die Zufallszahlen generiert und auf die passende Größe umgerechnet. Wegen meiner späteren "Sortierung" müssen dabei 0-Einträge ausgeschlossen werden. Danach wird je nachdem, ob der Punkt im Kreis liegt oder nicht der jeweilige Punkt in Spalte 1+2 bzw. 3+4 eines Arrays gespeichert. (Beim Speichern in Spalte 1+2 bleiben Spalten 3+4 Null) Daraufhin kann bereits die Zahl der Treffer und die Trefferquote ausgegeben werden. Danach drösel ich das Array in die einzelnen Zeilen auf und prüfe auf 0-Einträge. Diese werden dann aus dem 1-D-Array gelöscht. (Damit ich bei der Visualisierung nicht x-mal den Punkt 0/0 angezeigt bekomme) Die einzelnen korrigierten Zeilen werden nun zu Clustern zusammengefasst und zusammen mit einem vorher gezeichnetem Kreis visualisiert. Der letzte Teil in dem die Zeilen auf 0-Einträge geprüft werden dauert scheinbar am längsten. Wie könnte ich diesen Teil optimieren? Bzw. wie könnte ich bei der Überprüfung "Liegt der Punkt im Kreis oder nicht?" geschickter vorgehen? Vielen Dank schonmal! Gruß, Christian RE: Effizienter Programmieren - GerdW - 28.05.2013 16:37 Hallo Christian, ohne dein VI anschauen zu können möchte ich dich auf die komplexen Zahlen verweisen: [attachment=44824] Die FOR-Loop generiert Zufallszahlen, die auf den Bereich [-1,+1] "ausgedehnt" werden. Ab dann wird mit komplexen Zahlen gearbeitet: der Vergleich mit dem Kreis reduziert sich auf die Abfrage des Radius! Wenn dein VI zu langsam ist/wird, hast du wohl auf LabVIEW-Sachen wie Autoindexing etc. verzichtet... RE: Effizienter Programmieren - jg - 28.05.2013 20:31 Die Sequenzstruktur ist überflüssig, es wird schon alles per DATAFLOW in der richtigen Reihenfolge abgearbeitet. Total überflüssig ist die äußere FOR-Schleife im zweiten Sequenz-Schritt, und das ist auch dein Performance-Killer. Bei 10000 Schüssen machst du 10000-mal dieselbe Auswertung! Gruß, Jens RE: Effizienter Programmieren - ChrisSchul - 29.05.2013 07:04 Ohjeh, Anfängerfehler VIELEN DANK! Die For-Schleife war ein relikt aus einem anderem Versuch gewesen. Ohne die geht es natürlich jetzt dementsprechend schneller! Danke auch für den Tip mit den komplexen Zahlen! RE: Effizienter Programmieren - Y-P - 29.05.2013 07:51 Hallo Gerd, kannst Du mir mal das Bsp. hochladen? Dann muss ich es nicht "nachbauen". Gruß Markus (28.05.2013 16:37 )GerdW schrieb: Hallo Christian, RE: Effizienter Programmieren - GerdW - 29.05.2013 07:56 Hallo Markus, Zitat:kannst Du mir mal das Bsp. hochladen? Dann muss ich es nicht "nachbauen".Tut mir leid, hab's nicht mehr! Du kennst doch die inoffizielle Forumregel: Wenn der OP kein VI anhängt, bekommt er auch keines geliefert... @Chris: Wenn du willst, dass deine VIs "besser" werden, solltest du sie auch hier anhängen... RE: Effizienter Programmieren - Y-P - 29.05.2013 09:19 Hab's noch etwas getunt: [attachment=44831] [attachment=44830] Gruß Markus EDIT: Statt Durchmesser meine ich natürlich den Radius (wer's ändern will). RE: Effizienter Programmieren - GerdW - 29.05.2013 09:40 Hallo Markus, und jetzt noch das Ramp.vi statt der FOR-Loop zum Berechnen der Winkel von 0 bis 2pi RE: Effizienter Programmieren - Lucki - 29.05.2013 12:27 Und noch'n VI.. [attachment=44833] [attachment=44834] [attachment=44835] Übrigens: Für den Aufbau der Arrays hattest Du die Ersetzen-Funktion gewählt. Brav so, denn es beweist, dass Du fleißig im Forum gelesen hast, wo es allerorten empfohlen wird. Bei neueren Versionen von LV bringt es aber nur bei sehr großen Array was, hier, wo du sicher nicht über 10000 Elemente gehen wirst, bringt es nichts. |