Du C++ plus rapide

Publié le par Chkone

Pour du C++ plus rapide vous avez intérêt tout d'abord, absolument, il faut, vous devez, coder sans prendre en considération les problèmes d'optimisation puis après vous pourrez :
  • Utiliser de préférence un int lorsque vous gérez des entiers.
  • Utiliser des float lorsque des double ou long double ne sont pas nécessaire.
  • Sauter dans les fichiers (utiliser ftell et fseek) au lieu de lire octet par octet.
  • Lorsque vous divisez ou multipliez des entiers par des puissances de 2 utiliser k >>= (1 << n) et k <<=Et (1 << n) au lieu de * et / (mais attention au perte d'information et la fin du décalage).
  • Lorsque vous avez des boucles dont vous connaissez le nombre d'itération utiliser while(i--) au lieu d'un for(int u = 0; u < i; u++) la comparaison à 0 est beaucoup plus rapide.
  • Recodez les fonctions mathématique standard en ASM (si vous ne cherchez pas la portabilité) [La fonction racine carré codé en ASM est 900% plus rapide que celle de la fonction standard avec l'algorithme de Newton].
  • Utiliser fastcall pour les fonctions qui seront souvent utilisées.
  • Précalculer ce qui peut l'être.
  • Utiliser les const quand il faut ou les #define.
  • i++ estplus rapide que --i.
  • Les multiplications sont plus rapide que les divisions.
  • Utiliser a+=b au lieu de a=a+b.
  • Lors de vos test mettez le code le moin problable dans le else (par exemple divisibiliter par 0).
Sinon ne faite absolument rien et le haut et grand compilateur gcc, VC++, ... Ferons tous celà... Enfin pas toujours...

Publié dans C++

Commenter cet article

nicolas66 18/06/2008 00:41

Tout d'abord, le meilleur moyen de gagner en temps d'exécution est sans doute de baisser la complexité des algos qu'on utilise.

Seulement quand l'algo est bien rôdé, on peut essayer de grignoter quelques ms par-ci et par-là ^^

Jeckle 31/03/2008 17:01

Toutes ses informations sont hautement dépendantes de la plateforme sur laquelle on compile. Si on prend le cas du PC, oui les compilateurs font un boulot plutôt correct.
Cependant, je tiens a démystifier le point sur i++(et i--) et le ++i(et --i). Celui ci dépend hautement du type de i. Pour un type simple pas de différence (le compilateur incrémente ou décrémente la valeur que le ++ (ou le --) soit devant ou derrière. La ou ça peut cacher quelque chose , c'est quand i est un objet C++ a part entière qui redéfini l'opérateur ++ (ou --). Car alors l'opérateur surchargé sera appelé ( au prix d'un appel de méthode et de l'exécution de son contenu )
Concernant le point sur a+=b , le code generé est le même et ce quelque soit le compilateur, car c'est un raccourci du langage qui évite juste de taper le a=a+b
Ce n'est que la partie haute de l'iceberg, car quand il s'agit d'optimiser pour la vitesse , les instructions ne sont pas toujours les seules a compter, il y aussi :
- la taille du code au sein des boucles
- les accès mémoire ( qui utilise bien ou pas le cache)
- la parallélisation des instructions au sein du processeur
- la parallélisation entre processeur et carte graphique ...
- La façon d'organiser les données puis de les traiter
- j'en passe et des meilleures :)
Donc un conseil , d'un vieux du code :) :
- Faites confiance au compilo (comme au début de l'article sans vus soucier de l'optim), mesurez votre code (en timing)
- Identifiez les problèmes de perfs ( ils seront toujours la ou vous les attendez le moins )
- Résolvez le par de l'optim de code ou un meilleur design.

Bon code a tous.