La prima cosa che devi capire è l'hardware su cui stai eseguendo. Come gestisce le ramificazioni? Che dire della memorizzazione nella cache? Ha un set di istruzioni SIMD? Quanti processori può usare? Deve condividere il tempo del processore con qualcos'altro?
È possibile risolvere lo stesso problema in modi molto diversi: anche la scelta dell'algoritmo dovrebbe dipendere dall'hardware. In alcuni casi O (N) può funzionare più lentamente di O (NlogN) (a seconda dell'implementazione).
Come grossolana panoramica sull'ottimizzazione, la prima cosa che vorrei fare è guardare esattamente quali problemi e quali dati stai cercando di risolvere. Quindi ottimizzare per quello. Se desideri prestazioni estreme, dimentica le soluzioni generiche: puoi applicare un caso speciale a tutto ciò che non corrisponde al caso più utilizzato.
Quindi profilo. Profilo, profilo, profilo. Osserva l'utilizzo della memoria, osserva le penalità di ramificazione, Guarda l'overhead della chiamata di funzione, osserva l'utilizzo della pipeline. Scopri cosa sta rallentando il tuo codice. Probabilmente è l'accesso ai dati (ho scritto un articolo chiamato "L'elefante della latenza" sul sovraccarico dell'accesso ai dati - google esso. Non posso pubblicare 2 link qui perché non ho abbastanza "reputazione"), quindi esaminalo attentamente e quindi ottimizza il layout dei tuoi dati ( le matrici omogenee grandi e piatte sono fantastiche ) e l'accesso ai dati (prefetch ove possibile).
Una volta minimizzato il sovraccarico del sottosistema di memoria, prova a determinare se le istruzioni sono ora il collo di bottiglia (si spera che lo siano), quindi guarda le implementazioni SIMD del tuo algoritmo - Le implementazioni di Structure-of-Arrays (SoA) possono essere molto dati e cache delle istruzioni efficiente. Se SIMD non è adatto per il tuo problema, potrebbe essere necessaria la codifica a livello di intrinseco e assemblatore.
Se hai ancora bisogno di più velocità, vai in parallelo. Se hai il vantaggio di correre su una PS3, le SPU sono i tuoi amici. Usali, amali. Se hai già scritto una soluzione SIMD, otterrai un enorme vantaggio passando a SPU.
E poi, profila ancora un po '. Prova negli scenari di gioco - questo codice è ancora il collo di bottiglia? Puoi cambiare il modo in cui questo codice viene utilizzato a un livello superiore per minimizzarne l'utilizzo (in realtà, questo dovrebbe essere il tuo primo passo)? Puoi rinviare i calcoli su più frame?
Qualunque sia la piattaforma su cui ti trovi, impara il più possibile sull'hardware e sui profili disponibili. Non dare per scontato di sapere qual è il collo di bottiglia: trovalo con il tuo profiler. E assicurati di avere un'euristica per determinare se hai effettivamente reso il tuo gioco più veloce.
E quindi profilalo di nuovo.