Performance Frage - eigene Vektorklasse



  • Alle alle miteinander, ich bin noch recht neu zu C++ (Beginner) und habe eine Frage zur Perfromance einer Vektorklasse die ich geschrieben habe.

    Zur Vorgeschichte.. Ich habe vor einiger Zeit mal mit IDL gearbeitet. Das praktische bei dieser Sprache war, dass Vektoren und Matritzen durch über die Standartoperatoren +,*,... usw. also Elementeweise addiert, multipliziert usw. werden konnten. Alles schön und gut ..nur bin ich kein großer Freund von IDL geworden und habe nun versucht quasi zu Übungszwecken in C++ eine Vektorklasse zu schreiben die diese Operationen im begrenztem Maß auch kann.

    template<typename T>
        class SVLvector{
        private:
                T *Vector;
                int length;
        public:
            //Constructors
            SVLvector(int n){..}
    
            SVLvector(){length=0;}
    
            SVLvector(const SVLvector &other){...}
    
           ~SVLvector(){ delete[] Vector;}
    //.... Ein par andere Funktionen und Operatoren hier ein Beispiel
    
            SVLvector operator + (const SVLvector &other){
                assert(other.length==length);
    
                SVLvector new_vector(length);
                for(int i=0;i<length;i++)new_vector.Vector[i]=Vector[i]+other.Vector[i];
                return new_vector;
            }
    //..usw
    };
    

    Bisher habe ich auch keine Probleme mit der Klasse feststellen können..es läuft.
    Nun möchte ich aber zum Beispiel mit dieser Klasse Aufgaben im Bereich "Datenanalyse" verwirklichen zB. lassen sich Korrellationsfunktionen , Mittelwertfunktionen usw. damit angenehm schreiben. Das funktioniert auch und ist sehr übersichtlich (was ja mein Ziel war). Soweit zur Idee.

    Nun kam mir aber neulich in den Sinn das diese Implementation über die Operatoren eine ziemlich schlechte Laufzeit haben könnten. Insbesondere wenn ich nun sehr große Vektoren habe und viele Operatoren hintereinander anwende...Dann wiederum dachte ich mir,dass das aber auch davon abhängt wie mein Compiler (minGW) das ganze letztlich interpretiert?

    Also im Kurzen.. Hat es überhaupt Sinn aus Sicht der Laufzeit mit einer solchen Klasse und ihren Operatoren zu arbeiten... oder macht das keinen großen Unterschied zB. wenn ich es stattdessen gleiches mittels Schleifen ausschreiben würde.

    Vieleicht hat ja jemand auch noch gute Optimierungs Kniffe parat. Vielen Dank. :xmas1:

    Dantex :xmas2:


  • Mod

    Klassen und Operatoren sind reine Abstraktionen auf Ebene der Programmierung. Im fertigen Programm gibt es davon nichts mehr. Entsprechend ist der Performanceverlust dadurch 0.

    Wenn es dir wirklich auf Performance ankommt, solltest du aber mal nach Bibliotheken von Leuten Ausschau halten, die sich professionell damit beschäftigen. Gerade im Bereich der linearen Algebra gibt es da mehr als genug. Die schreiben nämlich nicht bloß ordentlichen Code (das kannst du auch), sondern haben auch die Zeit und das Wissen irgendwelche dreckigen Tricks reinzubauen auf die man nie käme und diese ausgiebig zu testen.



  • Auf dieser Ebene etwas optimieren zu wollen macht keinen Sinn. Operatoren sind wie schon gesagt nicht das Problem, falls es nicht performant ist, sondern eher die schlussendliche Implementierung der Algorithmen und den dafür geeigneten speziellen Optimierungen des Codes.

    Benutz dazu lieber eine Bibliothek, wie z.B eine BLAS Implementierung.

    btw:
    Falls du dich für das ganze Low Level Zeugs interessierst kann ich dir das Buch hier empfehlen:
    http://csapp.cs.cmu.edu/

    Bietet einen guten Grundstein für das Verständnis moderner Computer Systeme und somit auch die benötigten Grundlagen für Optimierungen, die wirklich etwas ausmachen.



  • Vielen Dank euch beiden.

    Also ich werde mir mal die Boost bzw uBlas Packete anschauen. Mein Ziel ist im Grunde ja nicht eine Algebra Libary zu zu schreiben, sondern nur eine Vektorklasse die keine skalare Vektormultiplikation durchführt (eben nur Elementeweise Ausführung Vektor1*Vektor2->Vektor3)-- was ich bei IDL eben eine nette Sache fand und für C++ umsetzen wollte..letztlich alles zur Übung..aber habe es dann bei anderen Sachen weitergenutzt. Aber vieleicht funktioniert das mit den Vektoren bei der uBlas Lib ja bereits, dann wäre es in der Tat sinvoller damit zu arbeiten...wird sich zeigen wenn ich da durchgestiegen bin XD.
    Das mit dem Buch ist ein guter Tip.. habe auch mal ins erste Kapitel reingeschaut.. es ist in der Tat etwas das ich gebrauchen könnte Grundlagenwissen 😉

    wünsche allen eine schöne Weinacht :xmas1:

    MFG DanteX :xmas2:


Anmelden zum Antworten