Boucles for et performance …

Bon ben une autre découverte. Pas vraiment neuve vu que j’avais déjà trouvé un article en parlant, mais je pensais vraiment pas que ça se vérifiait.

L’article parlait des boucles for et de la manière optimale de les écrire. Entre autres, il est recommandé de partir de l’élément maximal et de terminer à zéro (alors que la plupart des gens partent de zéro et termine à l’élément maximal) La raison invoquée étant que tester la différence à zéro est plus rapide que tester l’infériorité à une valeur différente de zéro … pour moi, n’importe quel test d’égalité (fut-ce <, >, <=, >=, !=, ==) prenait le même nombre de cycles du CPU … et bien non :

#define MAX 10000000

for (int i = 0; i < MAX; ++i)
// ... quelque chose à faire ici

for (int i = MAX; i != 0; --i)
// la même chose que précédemment

La deuxième boucle est plus rapide … même en mode release avec les optimisations à fond. Pas de beaucoup, mais j’ai été surpris. Du coup, autant prendre l’habitude d’utiliser la deuxième formulation.

std::string et comparaisons de chaines

Petite découverte aujourd’hui concernant les comparaisons de chaînes de caractères via les std::string’s.

Plusieurs manières existent pour comparer une std::string à une chaine de caractère : l’opérateur == ou != et la méthode compare() Après quelques tests, il se trouve que la méthode compare est beaucoup plus rapide que la comparaison via les opérateurs. Pas de code, pas de résultats, la flemme de le faire. Mais morale : Utilisez std::string::compare() !!

Panne de courant

Après un chtit piquenique au parc de Longchamp ce midi (j’aurais jamais du mettre un jean sombre et des chaussures de ville … j’ai faillit mourir desséché) on a eu droit à une jolie coupure de courant en rentrant au taf !

Du coup notre ami Lychen nous a fait des dessins sur mon tableau véléda histoire de passer le temps :)

Les joies des file streams …

Grande découverte aujourd’hui !
Considérons le bout de code suivant :

std::fstream stream;
std::string str;
stream.open("toto.txt", std::ios_base::in);

// read until the end and print the content
while (std::getline(stream, str).eof() == false)
    std::cout << str;

// rewind
stream.seekp(0);

// re-read
while (std::getline(stream, str).eof() == false)
    std::cout << str;

A priori, le contenu est affiché 2 fois de suite ? Ben non … la première boucle atteint la fin du fichier. Or la fonction std::getline, lorsqu’elle atteint la fin du stream, fait appel à la méthode setstate(failbit) dudit stream.
Et seekp ne reset pas cet état !! Ce qui fait qu’à la prochaine lecture, lorsque l’on teste si l’on est à la fin du fichier, le test est vérifié dès le début !

Il faut donc réinitialiser les bits d’information du stream avant de faire le seekp pour que ça marche :

stream.clear();
stream.seekp(0);

Là la deuxième boucle affiche bien le contenu. C’est un peu étrange que seekp ne puisse pas réinitialiser le bit de fin de fichier tout seul …

Réglage de la qualité graphique par macro

High quality
/console farclip 777
/console horizonfarclip 6226
/console groundeffectdensity 256
/console groundeffectdist 140
/console smallcull 0
/console skycloudlod 3
/console characterambient 0

Low quality
/console groundEffectDensity 16
/console groundEffectDist 1
/console horizonfarclip 1305
/console farclip 177
/console characterAmbient 1
/console smallcull 1
/console skycloudlod 1
/console detailDoodadAlpha 1