Optimering af classes/structs

Tags:    c++

Jeg er igang med at lave et lille fysik-library, hvor jeg vil kunne lave nogle simulationer af realistisk fysik.

Jeg starter i det helt simple med en Vector-struct med hvilken jeg skal kunne lave nogle forskellige regneoperationer. I programmet kommer jeg til at lave en hel del af disse Vector-operationer, så det skal helst gå så hurtigt som muligt - inden for de rammer, der nu er når jeg bruger structs med member funktioner og operator overload.

Spørgsmål 1: Bliver non-member funktioner eksekveret langsommere end member funktioner?
Fold kodeboks ind/udKode 


Samtidig overvejer om løsning 1 er hurtigere (hvilket jeg tror) end løsning 2 i non-member funktionen.

Hvis det er tilfældet at non-member funktionen bliver eksekveret langsommere vil det jo være hurtigere at skrive
Vector*2 end 2*Vector - hvilket for mig er en smule irriterende.

Spørgsmål 2: Kald af allerede definerede operatorer i forhold til redefinition. Betragt nedenstående kode og kommentarer:
Fold kodeboks ind/udKode 


Løsning 2 er genbrugen af de allerede definerede operatorer - men jeg overvejer om kaldet af disse vil være langsommere end at definere løsningen direkte (løsning 1).
Løsning 2 er en del mere behænding men hvis den er langsommere...

På forhånd tak. (desværre har jeg ikke flere point jeg kan udlove :/ )

qff



2 svar postet i denne tråd vises herunder
1 indlæg har modtaget i alt 1 karma
Sorter efter stemmer Sorter efter dato
Hvis det ser simplere ud er det ofte også tilfældet.
Hvad angår member function og non-member function kan jeg ikke se nogen grund til at der skulle være nogen forskel i eksekveringen, men det er mere bekvemt og sikkert med member functitons.

Med mindre dine operatorer er meget nødvendige kan jeg ikke anbefale at inkludere dem.




Spørgsmål 1: Bliver non-member funktioner eksekveret langsommere end member funktioner?

Eksekveringen er der ingen forskel på, men kaldet til en member funktion er langsommere end en non-member.
Derudover kan du optimere ved at erklære den static og const.
I C++ kan du også erklære den inline, hvilket også kan gøre en forskel.


Samtidig overvejer om løsning 1 er hurtigere (hvilket jeg tror) end løsning 2 i non-member funktionen.

Test det. Gør det en milliard gange på hver måde og se hvad der tager længst tid.


Spørgsmål 2: Kald af allerede definerede operatorer i forhold til redefinition. Betragt nedenstående kode og kommentarer:

Løsning 1 er hurtigere end løsning 2 fordi du slipper for et funktions kald. Og så igen. For hvis du erklærer funktionen inline så indsætter compileren selv koden.
Skriv hellere koden læseligt end manuelt optimeret, og lad compileren optimere.
Hvis du så synes, at resultatet er for langsomt, så gå i gang med optimering:
"Premature optimization is the root of all evil" - Donald Knuth



t