Se optimointi kun olisi noin helppoa että heitetään vaan prossu flägejä kääntäjästä päälle. Kyllä se itse koodi vaatii niitä optimointeja myös ja sieltä saadaan nipistettyä paljonkin ulos.
Koodaan töikseni kääntäjän optimointeja joten väitän tietäväni koodin optimoinnista aika paljon.
Kun kääntäjäni kääntää koodia liian hitaasti(kääntäjäni ajoaika liian pitkä), optimoin sitä pääasiassa siten, että ensin etsin profilointityökalulla funktiot, jotka vievät eniten aikaa.
Tämän jälkeen luen ihan C++-tasolla sitä koodia niistä eniten aikaa vievistä funktioista, että, onko siellä tehty jotain tyhmää.
Usein löydän sieltä esim. koodin
for (int i = 0; i < a.size(); i++) {
...
}
... jonka muutan muotoon
size = a.size();
for (int i = 0; i < size; i++) {
...
}
jossa size()-funktiolle tulee vähemmän kutsuja (se voi joskus olla hidas, jos tietorakenne on monimutkaisempi)
Toinen yleinen tilanne on, että siellä on jossain turhaan kaksi sisäkkäistä for-looppia (eli O(n²) ajoaika).
Vaihdan jonkun std::vectorin sieltä std::mapiksi ja saan sen avulla tämän rutiinin ajoajaksi O(n*log N).
Jonkin verran turhia dynamic_casteja olen myös vaihtanut static_casteiksi.
Kaikki näistä mainituista optimoinneista hyödyttää ihan yhtä paljon AMDn kuin intelin prosessoreilla, itseasiassa en ole vielä KOSKAAN tehnyt kääntäjääni mitään sellaista sen ajoaikaa nopeuttavaa optimointia, joka tähtäisi sen nopeuttamiseen nimenomaan intelin prossuilla(muiden mikroarkkitehtuurien kustannuksella), vaikka työkoneessani on aina ollut intelin prossu.
Kääntäjäni sen sijaan tuottaa koodia customoiduille staattisesti skeduloiduille prosessoreille. Niissä pitää kaikki laskea kellojaksontarkasti, ja teen todella paljon matalan tason nysväystä optimaalisemman loputuloksen saavuttamiseksi.
Nykyaikaiset CPUt vaan eivät tätä aggressivista käskyskedulointinysväystä tarvi, koska niiden dynaaminen skedulointi ajaa koodia nopeasti vaikka käskyt tulisi sisään missä järjestyksessä tahansa (ja niissä se järjestys muutenkin koko ajan vaihtelee välimuistihutien ja haarautumisennustushutien takia).
Ja keskimäärin softat on nykyään korkealla tasolla todella huonosti optimoituja. Ei ole mitään järkeä alkaa nysväämään softan lähdekoodiin hirveästi valmistajakohtaisia optimointeja joilla jonkun asian X, joka tehdään miljoona kertaa, voi tehdä 30% nopeammin, jos koko asian X voisi oikeasti tehdä vain kerran sen miljoonan kerran sijasta kun softan suunnittelisi vähän järkevämmin.
Tärkein jossain määrin mikroarkkitehtuurikohtainen optimointi nykyaikana on datan sijoitettelu muistissa siten, että se osuu mukavasti välimuistilinjoihin, mutta
amdn ja intelin kaikkien nykyprosessorien välimuistilinjat ovat yhtä pitkiä joten optimointi kummalle tahansa valmistajalle takaa tässä suhteessa optimaalisen tuloksen myös toiselle