C++

Jeudi 26 juillet 2007
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...
Par Chkone
Ecrire un commentaire - Voir les 2 commentaires - Recommander
Mardi 24 juillet 2007
En C++ pour faire une racine carré en général on utilise la fonction de la bibliothèque standart sqrt et bien pas John Carmack developpeur pour Wolfenstein 3D, Doom et Quake. Et bien lui il est bizarre regarder comment il fait :
float SquareRootFloat(float number)
{
float x, y; const float f = 1.5F;
x = number * 0.5F;
y = number;
long i;
i = * ( long * ) &y;
i = 0x5f3759df - ( i >> 1 );
y = * ( float * ) &i;
y = y * ( f - ( x * y * y ) );
//y = y * ( f - ( x * y * y ) );
return number * y;
}

Franchement j'ai pas vraiment compris comment il fait ce bougre de Carmack est vraiment bizarre... Il passe des float en long. Cette ligne est vraiment bizarre :  "i = * ( long * ) &y;" ou encore "i = 0x5f3759df - ( i >> 1 );" Mais qu'est ce qui lui a pris de décoler des bits comme ça... Il parait que le mystère de la fonction ce trouve dans le nombre magique (en hexa biensur) : 0x5f3759df.

Mais ce petit John ne s'arrête pas là il nous fait la fonction racine inverse :
float Q_rsqrt( float number )
{
long i; float x2, y;
const float threehalfs = 1.5F;
x2 = number * 0.5F;
y = number;
i = * ( long * ) &y; // evil floating point bit level hacking
i = 0x5f3759df - ( i >> 1 ); // what the fuck?
y = * ( float * ) &i;
y = y * ( threehalfs - ( x2 * y * y ) ); // 1st iteration
// y = y * ( threehalfs - ( x2 * y * y ) ); // 2nd iteration, this can be removed
#ifndef Q3_VM
#ifdef __linux__
assert( !isnan(y) ); // bk010122 - FPE?
#endif
#endif
return y; }
Bizarre comme mec ce John en plus ces fonctions sont de bonnes aproximation :S Mais un mathématicien s'est penché sur la fonction racine inverse et en à fait une plus rapide :
float InvSqrt(float x)
{
float xhalf = 0.5f*x;
int i = *(int*)&x; // get bits for floating value
i = 0x5f375a86- (i>>1); // gives initial guess y0
x = *(float*)&i; // convert bits back to float
x = x*(1.5f-xhalf*x*x); // Newton step, repeating increases accuracy
return x;
}
Celle là c'est du Chris Lomont. Si ça vous tente de comprendre comment ça marche le matheux à publier un petit pdf : ici

Bon le monde de la programmation est vraiment bizarre...
Par Chkone
Ecrire un commentaire - Voir les 1 commentaires - Recommander

Présentation

Catégories

Recherche

Calendrier

Novembre 2009
L M M J V S D
            1
2 3 4 5 6 7 8
9 10 11 12 13 14 15
16 17 18 19 20 21 22
23 24 25 26 27 28 29
30            
<< < > >>

Créer un Blog

Syndication

  • Flux RSS des articles

Liens

Créer un blog sur over-blog.com - Contact - C.G.U. - Rémunération en droits d'auteur - Signaler un abus