Performance von inline Funktionen
-
Hallo Forum,
Ich portiere grade eines meiner Projekte von c# nach c++ und will die überladenen Operatoren meiner Vektorklasse inline erstellen da diese ohnehin nur 3 Zeilen länge besitzen.
So wie ich den präfix inline einer funktion verstanden habe ignoriert der Compiler den Funktionsaufruf und ersetzt den quellcode vor der compilation durch den eigentlichen In haqlt der Funktion?
Sollte ich das richtig verstanden haben dann sollte der überladene += Operator meiner Vektorklasse:
__forceinline void Vektor::operator+=(Vektor^ vekt) { Vektor::x += vekt->x; Vektor::y += vekt->y; Vektor::z += vekt->z; };Prototyp im header:
__forceinline void operator+=(Vektor^ vekt);Der Aufruf des Operators:
testvektor += testvektor2;sollte absolut äquivalent zu:
testvektor->x += testvektor2->x; testvektor->y += testvektor2->y; testvektor->z += testvektor2->z;sein.
Mein Problem: Beim test erhielt der inline überladener Operator eine auf 57% heruntergefahrene Performance im direkten Vergleich zur ausgeschriebenen Variante. Es scheint als würde der Compiler aus dem Operator nicht den gewünschten Code generieren.
Da diese Klasse in sehr zeitkritischen Programmen verwendet werden sollte wäre ich für hilfe sehr dankbar.
-
__forceinline void Vektor::operator+=(Vektor^ vekt)
Das ist kein C++.
-
hast du die höchste optimierungsstufe ? eigentlich sollte der compiler das automatisch inlinen, wenn es performanter ist.
-
Ja, das ist kein C++. Das ist C++/CLI. Was der JIT Compiler macht, kannst du schlecht beeinflußen. Außerdem hast du nicht verraten, wie du die Zeit überhaupt gestoppt hast.
Und bevor du von C# auf C++/CLI umsteigst, bleib auf jeden Fall bei C#. Auch wenn du richtiges C++ verwenden willst, überlegs dir dreimal, ob sich das in irgendeiner Weise lohnt.
-
__forceinline ist kein C++, sondern etwas VS spezifisches. Eigentlich unnötig, das wird eh geinlined werden. Was mich aber wundert: ^? Sind das nicht irgendwelche CLI Handles? Warum arbeitest du denn mit denen? Kann gut sein, dass die dir die Suppe versalzen.
-
"Moderne" Compiler können auch über Modulgrenzen inlinen.
-
Ja stimmt das is kein nativ c++ sry. ich arbeite mit winforms und präventiv der fehlermeldung die besagt das gemischte Datentypen nicht erlaubt sind verwende ich diesen handle. Einzige Wirkung ist das der Datentyp auf dem verwalteten Speicher allokiert wird und das er eben mit gcnew instanziert wird?
Sry für die ganzen dummen fragen abner ich wars bis jetzt gewohnt das mir c# alles Speicherverwaltungstechnische abnimmt.
die Zeit habe einfach mal aus eibfachheitsgründen über die differenz zweier Millisekundenangaben aus der Systemzeit berechnet die differenz bei der ausgeschriebenen Variante war bei gleich häufiger Ausführung der Befehle zeittechnisch 57% schneller als der überladene inline Operator.
-
Warum willst du von C# auf C++/CLI umsteigen? Das ist genau dieselbe Plattform, nur unendlich viel hässlicher und umständler.
Wie oft hast du die Methoden ausgeführt? Vielleicht kann der JIT Compiler das besser optimieren, wenn du ihn nicht zwingst etwas zu tun, was er nicht will

-
10 millionen mal aber die Methode dauert nicht länger als 1 Sekunde insofern lässt sich das denke ich verwerten.
Warum ich c++ lernen will?
Weil ich warum auch immer der Meinung bin das das professionell ist und weil es denke ich eine sehr gute performance hat die ich für meine simulationen benötige.
Und weil ich aus neugierde meinen Horizont erweitern will......
-
Muss der Vektor per Referenz übergeben werden? Wenn du da wild alle möglichen Vektoren miteinander addierst, die über den ganzen Heap verteilt sind, dann kann die fehlende Cache-Lokalität die Suppe versalzen.
-
Beide tests verwenden den selben source und eigentlich geht es mir auch nur darum endlich getrost die komfortablere überladene Operator Variante zu verwenden ohne dort Performance zu müssen.
Denn ansonsten sollte wie anfangs geschrieben der Compiler durch die inline direktive aus dem operator genau den selben code erzeugen wie die ausgeschriebene Variante?
-
c++neuling2 schrieb:
Warum ich c++ lernen will?
Es spricht nichts dagegen, C++ zu lernen. Aber dann bitte richtiges C++.
Worauf ich hinaus wollte, bei einem echten Projekt dürfte es sich kaum rentieren, von C# auf C++ umzusteigen. Wenn das nur deine Spielprojekte sind, kannst du natürlich machen was du willst.
-
Also siehst du den einzigen Vorteil von c++ in Graphik apis wie directx, und was meinst du mit richtigem c++?
Natives c++, wenn ja wie wird das in winforms verwendet?
-
sry habe da ein e reininterpretiert
-
c++neuling2 schrieb:
Natives c++, wenn ja wie wird das in winforms verwendet?
Gar nicht. Wenn du richtiges C++ lernen willst, dann lern richtiges C++. Und Zwar richtig. WinForms gibts da nicht, aber mit UI wirst du beim Lernen die erste Zeit sowieso nichts zu tun haben.
Wenn du WinForms willst, dann nimm C#, C++/CLI ist dafür völlig ungeeignet.
-
Nur mal damit du siehst, wie so etwas aussehen könnte.
struct vector3 { float x, y, z; vector3(float x, float y, float z) : x(x), y(y), z(z) {} }; vector3 operator + (const vector3& lhs, const vector3& rhs) { return vector3(lhs.x + rhs.x, lhs.y + rhs.y, lhs.z + rhs.z); }Würde man normalerweise wohl mit Templates etc. machen, aber das spare ich mir hier. Warum du da ^ Handles nutzt, ist mir immernoch ein Rätsel. So sollte zumindest von VS sicher alles geinlined werden.
-
Der Syntax von c++ ist mir bereits aus entsprechender Literatur bekannt, trotzdem danke für den code.
Wenn c++ gänzlich ungeeignet für winforms ist warum sind winforms anwendungen in c++ erstellbar?
mir gehts auch eigentlich erstmal ums prinzip das ganze in c++ nutzbar zu machen, also versuche ich auf "richtiges c++" umzusteigen.
ob das ganze in unverwalteten Klassen zu praktizieren hilft probier ich morgen aus, trotzdem schonmal danke für den support

-
c++neuling2 schrieb:
Wenn c++ gänzlich ungeeignet für winforms ist warum sind winforms anwendungen in c++ erstellbar?
Genauso wie du freihaendig Autofahren kannst und mit den Fuessen steuern... Nur weil es geht, ist es noch lange keine gute Idee.
C++/CLI ist eine Sprache die dafuer entwickelt wurde native C++ Anwendungen leichter mit .NET verschmelzen zu koennen. Niemand schreibt ernsthaft Code in C++/CLI - das ist nur zum zusammenbinden von nativen Code mit managed Code geeignet.
mir gehts auch eigentlich erstmal ums prinzip das ganze in c++ nutzbar zu machen, also versuche ich auf "richtiges c++" umzusteigen.
Dein Ansatz ist falsch. Wenn du C++ lernen oder dir anschauen willst, dann programmiere C++.
-
Dein Ansatz ist falsch. Wenn du C++ lernen oder dir anschauen willst, dann programmiere C++.
Das verwirrt mich jetzt endgültig, was versteht ihr genau unter c++ programmieren, wenn nicht das?
-
ohne cli