Funktionsaufruf aus klasse bringt performanceeinbruch?
-
Optimierung ist angeschaltet, das mit inline hab ich auch schon ausprobiert: das selbe ergebnis.
lustig ist jedoch wenn ich schreibe:
#define clearrgb(r,g,b) glClearColor((r),(g),(b),0.0f); \ glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
hab ich wieder 999 FPS?
-
Dass das Makro und das direkte Hinschreiben gleich schnell sind, ist klar. Hast du mal den hier generierten asm-Code mit dem der Singleton-Variante verglichen?
-
wie macht man das?
-
bzw. wie lass ich mir den code geben? ich benutze .NET
-
*push*
-
rechtsklick auf dein projekt im projektmappenexplorer->Eigentschaften->C/C++->AusgabeDateien->AssemblyAusgabe: Assembly mit Quellcode
oder irgendsowas halt...
-
Ein bisschen Eigeninitiative bitte :). Unter deinen Projekteinstellungen findest
du das unter Garantie.mfg
v R
-
Hi,
ich habs mir mal angeguckt und das kam dabei raus:
; direkte ausführung im code: ; ; Line 111 mov esi, esp push 0 push 1065353216 ; 3f800000H push 0 push 1065353216 ; 3f800000H call DWORD PTR __imp__glClearColor@16 cmp esi, esp call __RTC_CheckEsp ; Line 112 mov esi, esp push 16640 ; 00004100H call DWORD PTR __imp__glClear@4 cmp esi, esp call __RTC_CheckEsp ; aus klasse aufrufen ohne inline ; ; Line 111 call ?getInstance@OpenGLEngine@@SAAAV1@XZ ; OpenGLEngine::getInstance call ?getInstance@OpenGLEngine@@SAAAV1@XZ ; OpenGLEngine::getInstance mov DWORD PTR tv161[ebp], eax push 1065353216 ; 3f800000H push 0 push 1065353216 ; 3f800000H mov ecx, DWORD PTR tv161[ebp] call ?clear@OpenGLEngine@@QAEXMMM@Z ; OpenGLEngine::clear ; aus klasse aufrufen mit inline ; Line 111 call ?getInstance@OpenGLEngine@@SAAAV1@XZ ; OpenGLEngine::getInstance call ?getInstance@OpenGLEngine@@SAAAV1@XZ ; OpenGLEngine::getInstance mov DWORD PTR tv161[ebp], eax push 1065353216 ; 3f800000H push 0 push 1065353216 ; 3f800000H mov ecx, DWORD PTR tv161[ebp] call ?clear@OpenGLEngine@@QAEXMMM@Z ; OpenGLEngine::clear
das inline wird total misachtet! ich glaub aber nicht das der funktionsaufruf so lam ist sondern die singletons ansich? ist da was dran oder ist das nur eine vermutung?
-
Mal nen profiler drauf angesetzt ?
-
hab ich doch den besten FPS messer den es gibt: FRAPS!
ich mein der Assemblercode sagt ja schon alles, oder?
-
*push*
-
Da kannst du nicht viel machen, Macro ist wahrscheinlich noch die einfachste Lösung.
Wenn du .net benutzt dann benutzt du ja VC. Wenn ich mich richtig errinnere gibt es da ein Keyword das inline forciert: __forceinline oder so. Hab kein VC also alles vom hören sagen (oder lesen schreiben in diesem Fall
).
-
Die Frage ist doch wozu?
Wie oft in der Sekunde machst Du denn ein Clear?
Lohnt es sich da ein paar Nanosekunden zu gewinnen? Die Rechenleistung geht nachher eh bei ganz anderen Sachen drauf.
-
Kleine Anmerkung:
FPS messen in der Höhe ist absoluter Blödsinn.
-
Ich will bitte 1500 FPS, sonst ruckelt es :). Meine Augen sind naemlich
genetisch verbessert worden und deswegen stoeren mich FPS < 1500 :D.<Post bitte ignorieren, sonst gibbet flamewar, konnte es mir nur nich
verkneifen>mfg
v R
-
Jester schrieb:
Lohnt es sich da ein paar Nanosekunden zu gewinnen? Die Rechenleistung geht nachher eh bei ganz anderen Sachen drauf.
ja jede nanosek ist mir wichtig, weil ich nicht speed durch so eine lepsche sache verlieren will die ich umbedingt für andere sachen brauche z.B. KI. nebenbei möchte ich das mein Programm auf sehr alten rechnern läuft und deshalb ist mir optimierung sowieso sehr wichtig!
@Shade:
dann erklär mir doch den performanceeinbruch.
-
HILFE!!!! schrieb:
hab ich doch den besten FPS messer den es gibt: FRAPS!
ich mein der Assemblercode sagt ja schon alles, oder?
FRAPS sagt mir nix, nehme aber an das es die Frames Per Second misst.
Verwende mal einen Profiler und Du wirst erkennen wo genau da was verloren geht. Man kann natürlich auch einfach mal raten wie denn Dein Singleton implementiert ist oder wo die Zeit verloren geht.
Meiner Meinung nach hilft da ein Profiler deutlichst weiter.
-
HILFE!!! schrieb:
dann erklär mir doch den performanceeinbruc.
Mal abgesehen davon, dass ich den Sinn von
OpenGL::Instance().clear();
nicht sehe: was sagt denn der Profiler.
Wie teuer ist der Aufruf denn?Im ASM Code stehen 2(!) Aurfufe - warum?
BTW:
Man misst deshalb keine Frames, weil sie in der Höhe einfach unmessbar sind. Ob 70 Millionen FPS oder 100 FPS ist egal
-
frag mich doch nicht wieso da 2 assembler aufrufe stehen? Ich hab nur Geschrieben:
OpenGLEngine::getInstance().clear (1,0,1);
mehr hab ich auch net geschrieben und wie der Meyerssingleton aussieht weis man doch, oder?
-
Die Kristallkugel ist defekt. Deswegen kann ich Dir nich weiterhelfen.
(Wäre ja noch die Möglichkeit z.B. das Du das Singleton Objekt immer wieder neu erstellst etc.)