Programmierung: Schnell oder Einfach?

Design Patterns, Erklärungen zu Algorithmen, Optimierung, Softwarearchitektur
Forumsregeln
Wenn das Problem mit einer Programmiersprache direkt zusammenhängt, bitte HIER posten.
Antworten
Benutzeravatar
Zudomon
Establishment
Beiträge: 2253
Registriert: 25.03.2009, 07:20
Kontaktdaten:

Programmierung: Schnell oder Einfach?

Beitrag von Zudomon »

Hallo euch allen! :)
Ich würde gerne mal eure Meinung über folgenden Sachverhalt hören:
Habe bei mir 2D, 3D und 4D Vektoren. Außerdem benutze ich ja Dreiecke und Vierecke...
Das Problem an der ganzen Sache ist, dass ich nun immer differenzieren muss, wie die einzelnen Vektortypen und Polytypen gehandhabt werden sollen. Das könnte man umgehen, indem man z.B. nur 4D Vektoren und Vierecke nimmt ( die dann z.B. bei einem negativen Index als Dreiecke gelten könnten ). Dadurch wird der Quellcode um einiges durchschaubarer und einfacher. Natürlich muss man hier wenn man eine 2D Textur-Koordinate in 4D Vektoren unterbringt, das doppelte an Speicher benutzen, aber darum mache ich mir eigentlich erstmal keine Sorgen. Das Problem für mich ist eher, dass die Geschwindigkeit darunter leidet. :(

Zudem muss man noch sagen, dass das ganze eh nur im Editormodus relevant ist, in die Grafikkarte werden hinterher wieder die 2D, 3D und 4D Vektoren übergeben und auch die Vierecke müssen ja trianguliert sein.
Was man auch noch in die Überlegung mit einfließen lassen muss, ist die Tatsache, das man garnicht so oft Massen von Vektoren in der Applikation berechnen muss, und wenn doch, dann nur einmalig als Operation. Zumindest sehe ich darin nicht unbedingt einen Flaschenhals, aber es fällt mir sehr schwer, auf Geschwindigkeit aus designtechnischen Gründen zu verzichten.

Zum größten Teil macht mir Sorgen, wenn das Projekt wächst, ich die Übersicht durch die ganze Differenziererrei verliere.

Gruß
Zudo
Benutzeravatar
Aramis
Moderator
Beiträge: 1458
Registriert: 25.02.2009, 19:50
Echter Name: Alexander Gessler
Wohnort: 2016
Kontaktdaten:

Re: Programmierung: Schnell oder Einfach?

Beitrag von Aramis »

Natürlich muss man hier wenn man eine 2D Textur-Koordinate in 4D Vektoren unterbringt, das doppelte an Speicher benutzen, aber darum mache ich mir eigentlich erstmal keine Sorgen. Das Problem für mich ist eher, dass die Geschwindigkeit darunter leidet
Bist du dir sicher dass du damit Geschwindigkeit verlierst? 4D-Vektoren müssten für den Compiler deutlich einfacher in Bezug auf SSE zu optimieren sein.

Differenziert hätte ich insofern da für Vektoren verschiedener Größe ja auch andere Operationen definiert sein könnten, z.B. das Kreuzprodukt für 3D-Vektoren oder die Matrixmultiplikation für homogene 4D-Vektoren. Durch Verwendung verschiedener Typen erreichst du somit zur Kompilationszeit eine gewisse Sicherheit keine undefinierten Operationen aufzurufen.

Die viel interessantere Frage ist es, wie man am 'saubersten' Klassen für 2-, 3- und 4-dimensionale Vektoren anlegt. Die Bandbreite reicht von viel Templatemagie um maximal viel Code für alle Klassen zu verwenden, bis hin zu einfach auskodiert.
Das könnte man umgehen, indem man z.B. nur 4D Vektoren und Vierecke nimmt ( die dann z.B. bei einem negativen Index als Dreiecke gelten könnten ). Dadurch wird der Quellcode um einiges durchschaubarer und einfacher
Ganz im Gegenteil. Er wird unübersichtlich ohne Ende. In deinem Beispiel müsstest du dann nahezu überall diesen Sonderfall eines Dreiecks behandeln. Wenn du es doch mal vergisst, oder einfach an einer Stelle mal implizit annimmst nur 'echte' Vierecke zu haben, endest du mit unsicherem Quellcode der mit der Zeit nahezu unwartbar wird und dir auf Dauer nur Ärger macht :-)

Alex
Benutzeravatar
Zudomon
Establishment
Beiträge: 2253
Registriert: 25.03.2009, 07:20
Kontaktdaten:

Re: Programmierung: Schnell oder Einfach?

Beitrag von Zudomon »

Hi! Und danke für deine ausführliche Antwort!!

Die 2D, 3D, 4D Vektoren sind bei mir im Endeffekt nur die D3D Datentypen, welche ich nochmal mit einem eigenen record ( struct in c ) umhüllt habe. Habe da rumgetestet, sobald ich 4 statt 3 Komponenten in dem record definiere, dann wird es schon langsamer.
Ich habe gehofft, das man das irgendwie zu einem vereinen kann, aber das hat nie geklappt, ohne Geschwindigkeit zu verlieren.
Mathematisch wird das arbeiten nur auf 4D kein Problem machen, da ich dann einfach hauptsächlich als 3D Vektoren interpretieren würde, aber dennoch die Möglichkeit hätte, auch Farben und Knochenbindungen im den 4D zu speichern.
Echte 4D Vektoren brauchte ich noch nie, deswegen dachte ich ans zusammenlegen.

Bzgl. der Dreiecke/Vierecke dachte ich mir, dass man eventuell direkt durch die darauf anwendbaren Funktionen differenziert. So das man nur einmal den Sonderfall beachten muss, aber nach außen hin immer gleich ansteuern kann.
Helmut
Establishment
Beiträge: 237
Registriert: 11.07.2002, 15:49
Wohnort: Bonn
Kontaktdaten:

Re: Programmierung: Schnell oder Einfach?

Beitrag von Helmut »

Also irgendwie kann ich nicht glauben, dass das Rechnen mit 4D statt 3D Vektoren langsamer ist. Wie hast du das denn gemessen?

Aber du könntest du Rechnungen natürlich schon auf die einzelnen Vektoren spezialisieren ohne doppelten Code schreiben zu müssen, mit Templates. Wäre aber natürlich auch etwas aufwendig. Wenn du im alten Forum suchst wirste eine Klasse finden, die sowas kann.

Ciao
Benutzeravatar
Zudomon
Establishment
Beiträge: 2253
Registriert: 25.03.2009, 07:20
Kontaktdaten:

Re: Programmierung: Schnell oder Einfach?

Beitrag von Zudomon »

Ich habe 2 x 10 Millionen Vektoren mit Zufallswerte gefüllt und anschließend die Zeit zu gemessen, die es braucht, um alle beide miteinander zu addieren und das Ergebnis in weitere 10 Millionen Vektoren zu schreiben. Das ganze braucht bei mir etwa 80-100 ms bei 3D und bis zu 180ms bei 4D Vektoren. Wie gesagt, meine 3D und 4D Vektoren sind nur verpackte D3DXVector3 und D3DXVector4, die allerdings alle geinlined sind, damit meine Verpackung keine Geschwindigkeitseinbußen verursacht.
Es ist noch nichtmals wichtig, ob man die vierte Komponente mit einrechnet, sondern schon das bereitstellen im record versucht einen kleinen Geschwindigkeitsverlust. Vielleicht kann das dann nicht mehr so Effektiv gecached werden.

Leider gehen unter dem Turbo Delphi, welches ich verwende, noch keine Templates... :(
Benutzeravatar
Lord Delvin
Establishment
Beiträge: 575
Registriert: 05.07.2003, 11:17

Re: Programmierung: Schnell oder Einfach?

Beitrag von Lord Delvin »

Öhm...du kannst auch templates verwenden ohne templates zu haben, indem du die Template argumente als normale Variablen ablegst und mit ihnen auch so arbeitest..allerdings sieht das mim speed dann vermutlich eher nicht mehr so gut aus.

Der Speed unterschied kommt vermutlich vom prefetchen. Der Cache und die SSE Einheit sind in deinem Beispiel völlig daneben. Der Cache, weil du nichts doppelt verwendest und die SSEEinheit, weil die CPU nicht das Problem ist.

Von dem 4D als 3D Vektor Kram kann ich eignetlich nur abraten, das sieht nicht nur nicht gut im Code aus, sondern ist auch eigneltich sonst keine gute Idee...vielleicht willst du eine allgemeine Klasse schreiben, die n-Dimensional arbeiten kann und eine für den häufigsten fall, die automatisch hin und her castet(falls deine Sprache das zulässt...ich weis ja nicht, was das für eine Sprache sein soll, in der es keine Templates gibt :P).

Gruß
XML/JSON/EMF in schnell: OGSS
Keine Lust mehr auf C++? Versuche Tyr: Get & Get started
Benutzeravatar
Aramis
Moderator
Beiträge: 1458
Registriert: 25.02.2009, 19:50
Echter Name: Alexander Gessler
Wohnort: 2016
Kontaktdaten:

Re: Programmierung: Schnell oder Einfach?

Beitrag von Aramis »

Öhm...du kannst auch templates verwenden ohne templates zu haben, indem du die Template argumente als normale Variablen ablegst und mit ihnen auch so arbeitest
Öh ... nein. Jedenfalls kann man das bei der Sorte Templatemagie, die für geschickte Vektorenklassen erforderlich ist, vergessen.
Matthias Gubisch
Establishment
Beiträge: 470
Registriert: 01.03.2009, 19:09

Re: Programmierung: Schnell oder Einfach?

Beitrag von Matthias Gubisch »

Alexander Gessler hat geschrieben:
Öhm...du kannst auch templates verwenden ohne templates zu haben, indem du die Template argumente als normale Variablen ablegst und mit ihnen auch so arbeitest
Öh ... nein. Jedenfalls kann man das bei der Sorte Templatemagie, die für geschickte Vektorenklassen erforderlich ist, vergessen.
Stimmt...

Allerdings finde ich spricht nix dagegen wenn man mit homogenen 3D-Vektoren arbeitet. (Manche sagen auch 4D aber das ist IMHO mathematisch nicht ganz korrekt ;) )
Ich arbeite im 3d-Bereich eigentlich nur mit Homogenen 3d Vektoren, weil man dann bei Translationsmatrizen keine mathematischen Kunststücke machen muss...

Ausserdem haben die den Vorteil dass man sich davon auch noch eine Color Klasse ableiten kann.....

Für 2d würd ich allerdings eine Vektorklasse mit 2 Komponenten schreiben, zumindest wenn die Möglichkeit von Templates nicht gegeben ist.
Bevor man den Kopf schüttelt, sollte man sich vergewissern einen zu haben
Benutzeravatar
Lord Delvin
Establishment
Beiträge: 575
Registriert: 05.07.2003, 11:17

Re: Programmierung: Schnell oder Einfach?

Beitrag von Lord Delvin »

@templates: nö besonders schnell ist das wirklich nicht, aber ich glaub es sieht im code besser aus und besonders schnell sollte imho auch nicht das Ziel sein.Für besonders schnell hat glaub ich keiner von uns genug Ahnung von der Hardware die er nutzt und wenn wir ehrlich sind, dann ist es relativ egal, ob die Demo die nie jemanden außer uns interessiert schnell läuft oder nicht. Zumindest, wenn ihr wie ich programmiert um was zu lernen und Spaß zu haben:)

Matthias Gubisch hat geschrieben:Ausserdem haben die den Vorteil dass man sich davon auch noch eine Color Klasse ableiten kann.....
Wahh bitte nicht. Color und Vector haben wirklich nur gemein, dass sie 3 oder 4 Komponenten besitzen. Die Operationen auf beiden Typen sind im Allgemeinen eher Schnittfrei(bis auf == und sowas, aber das zählt hier mal nicht).
Man kann zwar Farben als Vector über einem Farbraum auffassen, aber das war zumindest in meinen Projekten nie besonders praktikabel, da einen sowas wie der Winkel oder die Senkrechte zwischen zwei Farben nicht interessiert. Höchstens die Distanz, aber schon das multiplizieren und addieren von Farben ist nicht zwingend so wie bei Vektoren, da zumindest ich gerne auch per Channel multiplikation nutze und das hat in nem Vektor nichts verloren.
Und für die Schnittmenge ne Oberklasse zu bilden ist eignetlich völlig daneben.

Gruß
XML/JSON/EMF in schnell: OGSS
Keine Lust mehr auf C++? Versuche Tyr: Get & Get started
Benutzeravatar
Zudomon
Establishment
Beiträge: 2253
Registriert: 25.03.2009, 07:20
Kontaktdaten:

Re: Programmierung: Schnell oder Einfach?

Beitrag von Zudomon »

Wie ähnlich sich Vektoren und Farben sind, sieht man am besten im Pixelshader, wo dann die Farbe mal ebend zum Vektor wird, mit ner Matrix multipliziert um dann damit ein Skalarprodukt zu bilden für Beleuchtung, was dann wiederrum mit der Farbe skaliert wird.
Addieren, subtrahieren, skalieren, interpolieren, maximieren, minimieren, clampen, das sind alles operationen die sowohl auf Vektoren, als auch auf Farben zutreffen.

Ich habe den Schritt gewagt. Oft hab ichs vorgehabt, aber dann im letzten moment einen Rückzieher gemacht. Gestern hab ich es durchgezogen, mein eigener 4D-Vektor, der alles abdeckt, von der Texturkoodrinate bis zur Farbe. Und es gibt nun auch nur noch Vierecke, dessen letzte komponente negativ sein kann und somit ein Dreieck darstellt.
Es ist kaum langsamer geworden. Entweder wird mich das in den nächsten Tagen zu Boden schmettern, oder die neue Vereinfachung wird mir neuen Auftrieb geben. Ich bin mal gespannt :D

Solange man für sich alleine programmiert, ist ja eh alles erlaubt :)
Antworten