was ist schneller oder macht es keinen unterschied ??
-
hallo,
class xTest { public: HWND m_hWnd; }
wenn ich nun mehrmals auf m_hWnd zugreifen will
void function(xTest* pTest) { //ist meim mehrfachen zugriff auf hWnd schneller HWND hWnd=pTest->m_hWnd; BOOL bTest=IsWindow(hWnd); //oder BOOL bTest=::IsWindow(pTest->m_hWnd); //oder ist alles beides genau so schnell, nur mit dem Unterschied das ich für hWnd unnötig speicher benötige und hWnd erst mal zuweisen muß ??? }
volker
-
Das mit der Tempvariable ist wahrscheinlich schneller. Das heißt aber nicht, dass du das machen solltest ... denn noch wahrscheinlicher ist, dass es überhaupt keinen messbaren Effekt hat. Gerade wenn du danach eine API aufrufst, verschwindet der Kostenunterschied geradezu, und ansonsten lohnen sich derartige Nano-Optimierungen höchstens in inneren Schleifen, die sehr oft pro Sekunde durchlaufen werden müssen.
Dabei hab ich noch gar nicht in Betracht gezogen, dass ein Compiler das auch optimieren kann (Common Subexpression Elimination), wodurch der Unterschied auf 0 zusammenschrumpft.
Grundregel beim Optimieren: Nicht machen, ausser du musst. Und wenn du optimieren musst, erst messen, dann bestimmen wo es klemmt. Nicht auf gut Glück die Positionen der Flaschenhälse erraten, das geht meist schief.
PS: Der zusätzlich "verschwendete" Speicher beläuft sich auf lächerliche 4 Bytes bzw 1 Register.
-
Nachmessen! Ich denke aber mal das die Variante mit dem Stack schneller ist, allerdings ist das VÖLLIG falsche Optimierung, da solltest du dir lieber über andere Dinge den Kopf zerbrechen als über solche Kinkerlitzchen.
-
danke,
Nachmessen! Ich denke aber mal das die Variante mit dem Stack schneller ist, allerdings ist das VÖLLIG falsche Optimierung, da solltest du dir lieber über andere Dinge den Kopf zerbrechen als über solche Kinkerlitzchen.
mir war auch nicht der Sinn nach Optimierung, im habe lange Zeit in Visual Basic programmiert und jetzt bei C++ habe ich festgestellt das ich dadurch häufig Zwischenvariablen anlege und benutze um ganz einfach schneller zu sein.
ich babe mir in c++ diesen vor/nachteil überlegt.
-
vdittrich schrieb:
hallo,
class xTest { public: HWND m_hWnd; }
wenn ich nun mehrmals auf m_hWnd zugreifen will
void function(xTest* pTest) { //ist meim mehrfachen zugriff auf hWnd schneller HWND hWnd=pTest->m_hWnd; BOOL bTest=IsWindow(hWnd); //oder BOOL bTest=::IsWindow(pTest->m_hWnd); //oder ist alles beides genau so schnell, nur mit dem Unterschied das ich für hWnd unnötig speicher benötige und hWnd erst mal zuweisen muß ??? }
volker
beides ist gleich schnell würde sogar vermuten dass erstere evt. sogal langsamer ist.
wenn die funktion IsWindow aufgerufen wird, dann wird sowieso pTest->m_hWnd erstmal auf den stack (temporäre variable) geschrieben, da parameter einer funktion. wenn IsWindow wieder zurückkehrt, dann wird der speicher der temp. var vom stack wieder freigegeben
-
Kommt ganz auf den Optimizer und den restlichen Code an.
In den meisten fällen bist du mit einer lokalen Variablen auf der sicheren Seite, allerdings kannst du mit zuvielen "entities" auch den Optimizer überfordern.Die FVor-und Nachteile hängen ziemlich stark von der Prozessoerarchitektur ab, das C++ speilt da kaum noch rein. Aber dazu müßte man Registernutzung, inlining, Cachelines, Code- vs. Datengröße, Instruction Pairing und wahrscheinlich noch ne ganze Menge mehr diskutieren.
[edit] wenn du die Variable nur einmal brauchst, macht es (bei gutem Optimizer) keinen Unterschied, aber heir ist ohne lokale Variable" auf der sicheren Seite.