Funktionsaufruf aus klasse bringt performanceeinbruch?
-
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.)
-
ich hab den singleton aus HummeSikkins FAQ kopiert, halt den Meyerssingleton.
-
HILFE!!! schrieb:
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!
Du verlierst keine Zeit, die die später woanders brauchen könntest.
Später berechnest du die ganze Spiellogik und dann kommst du gar nicht mehr so oft dazu, zu clearen. Und dann spielen die drei ns hin oder her gleich gar keine Rolle mehr.
-
Im ASM Code stehen 2(!) Aurfufe - warum?
Wo? clear wird nur einmal aufgerufen, aber getInstance wird zweimal aufgerufen, was wirklich interessant ist. Macht nicht wirklich sinn.
Mach mal folgendes:
// Am anfang irgendwo: OpenGLEngine & tmp = OpenGLEngine::getInstance(); // und der Aufruf: tmp.clear (1,0,1);
-
Die wichtigste Aussage meines Postings war:
warum
OpenGL::Instance().clear(); ?Was spricht gegen
OpenGL::clear()?
-
Ich verstehe ja, dass überfrühte Optimierung böse ist, aber wenn purer Code derart schneller ist als ein Meyers-Singleton-Aufruf + exakt derselbe Code, dann ist es doch *sehr* wahrscheinlich, dass jedes weitere Meyers-Singleton *genauso* bremst. Und damit hätte ich jedenfalls nicht gerechnet...
OpenGLDingens::getInstance() ist inline und steht im Header, oder? Wenn nicht, sollte es wohl dahin. Wenn ja, dann wundert es mich, dass es nicht geinlinet wird (wegen der static-Variable?).
Was ist dieses RTC_Dings? Klingt nach Runtime-Checks, klingt nach Debugmodus, klingt langsam. Ist das asm-Code aus einem Release-Kompilat?
Wenn du glaubst, dass der Singleton so langsam ist, warum postest du nicht mal den asm-Code von getInstance?
-
operator void schrieb:
OpenGLDingens::getInstance() ist inline und steht im Header, oder? Wenn nicht, sollte es wohl dahin. Wenn ja, dann wundert es mich, dass es nicht geinlinet wird (wegen der static-Variable?).
es ist inline und die codes sind aus dem release.