La première chose que vous devez comprendre est le matériel que vous utilisez. Comment gère-t-il les branches? Qu'en est-il de la mise en cache? At-il un jeu d'instructions SIMD? Combien de processeurs peut-il utiliser? Doit-il partager le temps processeur avec autre chose?
Vous pouvez résoudre le même problème de manières très différentes - même votre choix d'algorithme doit dépendre du matériel. Dans certains cas, O (N) peut fonctionner plus lentement que O (NlogN) (en fonction de la mise en œuvre).
En tant que vue d’ensemble de l’optimisation, la première chose à faire est d’examiner exactement quels problèmes et quelles données vous essayez de résoudre. Optimisez ensuite pour cela. Si vous voulez des performances extrêmes, oubliez les solutions génériques - vous pouvez personnaliser tout ce qui ne correspond pas à votre cas le plus utilisé.
Puis profil. Profil, profil, profil. Examinez l'utilisation de la mémoire, examinez les pénalités de branchement, examinez la surcharge des appels de fonction, examinez l'utilisation du pipeline. Déterminez ce qui ralentit votre code. Il s’agit probablement de l’accès aux données (j’ai écrit un article intitulé "The Latency Elephant" sur les frais généraux liés à l’accès aux données - google it. Je ne peux pas poster 2 liens ici car je n’ai pas assez de "réputation"), examinez de près cela et optimisez ensuite la disposition de vos données (de superbes baies plates et homogènes sont géniales ) et votre accès aux données (pré-extraction si possible).
Une fois que vous avez minimisé les frais généraux du sous-système de mémoire, essayez de déterminer si les instructions constituent maintenant le goulot d'étranglement (espérons-le), puis examinez les implémentations SIMD de votre algorithme - Les implémentations Structure-of-Arrays (SoA) peuvent être très data et cache d'instruction efficace. Si SIMD ne correspond pas à votre problème, des codages intrinsèques et de niveau assembleur peuvent être nécessaires.
Si vous avez encore besoin de plus de vitesse, passez en parallèle. Si vous avez l'avantage de fonctionner sur une PS3, alors les SPU sont vos amis. Utilisez-les, aimez-les. Si vous avez déjà écrit une solution SIMD, vous obtiendrez un avantage considérable en passant à SPU.
Et ensuite, profilez un peu plus. Testez dans des scénarios de jeu - ce code est-il toujours le goulot d'étranglement? Pouvez-vous changer la façon dont ce code est utilisé à un niveau supérieur pour minimiser son utilisation (en fait, cela devrait être votre première étape)? Pouvez-vous différer les calculs sur plusieurs images?
Quelle que soit la plate-forme sur laquelle vous vous trouvez, renseignez-vous le plus possible sur le matériel et les profileurs disponibles. Ne présumez pas que vous connaissez le goulot d'étranglement - trouvez-le avec votre profileur. Et assurez-vous d'avoir une heuristique pour déterminer si vous avez réellement accéléré votre jeu.
Et puis profilez à nouveau.