02 sept. 2013

Racine d'un entier 64 bits non signé en C

Ce billet est un peu spécial, dans le sens ou je me contente de poster un morceau de code sans beaucoup de commentaires. J'ai écrit ce code récemment pour résoudre un problème un peu agaçant : calculer une racine carrée sur un nombre entier 64 bits.

Pour ceux qui se disent que le problème est simple (appeler la fonction sqrt() de la librairie C ou std::sqlt() de la librairie standard C++), je répond "oui, presque". Parce qu'un nombre non signé de 64 bits ne peut étre représenté correctement sur un double de 64 bits (sqrt() utilise le co-processeur arithmétique de votre x86). On peut utiliser un long double - mais dans ce cas, les performances sont désastreuses (parce que votre processeur n'a pas de registre générique travaillant en 80 bits).

Tout ça pour dire que la fonction ci-dessous peut aussi vous être utile (même si elle n'est pas parfaite : elle dépends principalement de la réponse à une devinette : quelle est la valeur de la racine carrée que je cherche ? Plus je sais répondre précisément à cette devinette, plus l'exécution est rapide).

Lire la suite...

24 janv. 2013

Démarrer avec Android : les bases et le NDK

Logo Android

Une fois n'est pas coutume, je vais vous présenter ici non pas un article de fond, mais une sorte de tutoriel un peu plus détaillé que la moyenne. Le sujet du jour, c'est le développement d'une application Android. Pas n'importe quelle application cependant, puisqu'il s'agit de se préparer à l'arrivée ce cette console dont tout le monde parle - la dénommée OUYA.

Bien évidemment, étant donné la nature de l’exercice et la complexité du sujet, je ne peux pas me permettre d'aller au fond des choses. Si le sujet vous plait (et je le verrais d'après vos commentaires, n'est-ce pas ?) alors j'essaierais d'aborder encore la programmation Android dans un billet ultérieur. Je ne vous promet rien - à vous de me convaincre ?

Avant de commencer, un dernier mot : il est évident que pour comprendre ce tutoriel, vous avez besoin de connaître (un peu) Java, XML et C++. La connaissance de l'IDE eclipse est un plus intéressant, et il est tout de même préférable de connaître un peu Android du point de vue utilisateur.

Lire la suite...

05 janv. 2013

Micro-optimisations : booléens contre ensemble de drapeaux

Il y a quelque temps, un utilisateur de mon blog (alpha_one_x86) a proposé quelques sujets qui avait pour lui un intérêt. Certains sujets traitant de micro-optimisations - et étant moi même intéressé par ce type d'optimisation - j'ai décide de consacrer un premier billet à quelques petites explications touchant non pas au comment, mais au pourquoi.

Si vous avez des questions liées à ce type de sujet (ou si vous souhaitez que je discute d'autres micro-optimisations), n'ayez pas peur de me le faire savoir en postant un commentaire ici ou là (voir en me contactant).

Je vais quand même insister sur un point précis : je parle ici de micro-optimisation, c'est à dire d'optimisations dont l'impact sur les performances est très souvent négligeable. Il arrive de temps en temps qu'une telle optimisation offre un réel avantage, mais ces cas sont rares. Avant de mettre en pratique un des cas présenté ci-dessous, il convient de mesurer l'impact sur votre code et de peser le pour et le contre, notamment en terme de rapport gain/maintenance et gain/temps de développement.

Ne venez pas dire que je ne vous ai pas prévenu :)

Lire la suite...

01 août 2012

C++11 : il y a des choses qui changent

Annoncer à grand renfort de publicité (ou pas) qu'il y a eu quelques changements dans la nouvelle norme C++ 11 par rapport à la précédente norme de 2003, c'est un peu comme dire qu'il se pourrait que la lune soit distante de la terre d'un peu plus de 400 mètres : ça n'a pas grand intérêt, parce que c'est évident. Tout le monde[1] sait que C++11 apporte son lot de nouveautés, et que celles-ci sont importantes : rvalue references, le mot-clef auto, les variadic templates, la gestion de la concurrence, etc. Les additions sont nombreuses et quelques fois complexes.

Par contre, ceux qui, croyant bien faire, pensent que le nouveau standard conserve un compatibilité parfaite avec la version précédente du standard pourraient avoir quelques mauvaises surprises. Et pas seulement à la marge...

Note

[1] enfin, tous les programmeurs C++ qui s'intéressent un tant soi peu au langage lui-même

Lire la suite...

11 mar. 2012

Optimisation : de la prédiction des branchements

Ne me demandez pas pourquoi j'écris aujourd'hui sur un sujet qui semble si éloigné de mon domaine de prédilection, l'architecture logicielle et le code haut niveau (je vous rassure, ce n'est pas mon seul domaine de compétence). Je n'en ai pas la moindre idée. C'est peut-être le fait d'avoir ce manuel d'optimisation des processeurs Intel sur mon étagère, bien en face de mes yeux. Ou parce que c'est un sujet dont nous avons discuté récemment au travail. Ou parce que ça traînait dans ma tête depuis un petit moment déjà. Ou parce que j'ai lu récemment sur #AltDevBlogADay un post sur un sujet proche.

Quoi qu'il en soit, aujourd'hui je voulais vous parler des branchements que vous ajoutez dans votre code.

Un petit warning avant de continuer : comprendre ce billet pourra nécessiter de votre part une petite mise à niveau sur certains concepts, et notamment sur l'assembleur x86. Connaître le processus de compilation lié à votre langage sera un plus, et avoir une expérience en lien avec le code assembleur généré par le compilateur va probablement vous aider. Enfin, des connaissances sur l'architecture des processeurs (et notamment sur l'architecture des processeurs x86) va probablement simplifier un peu les détails de ce billet.

Lire la suite...

08 mar. 2012

libroxsd : lightweight XSD validation

Today is the day I chose to create the libroxsd open source project.

By itself, the sentence does not give you mush details. So here are a few of them.

Lire la suite...

13 oct. 2011

Vérifier si une fenêtre est recouverte par d'autre fenêtres (Win32 API)

Ce code, très court, vérifie si une fenêtre contrôlée par un HWND est couverte par une ou plusieurs autres fenêtres de la même application.

Lire la suite...

14 mar. 2011

De la gestion de la mémoire

Et bien, il était temps ! Après plus d'un mois sans nouvelle, ce blog commençait à se dessécher, et sa peau parcheminée commençait même à craquer. A ma décharge, je dois dire que je prépare un volumineux, très volumineux scénario pour Dungeons & Dragons 4 qui devrait paraître dans un numéro ultérieur du webzine Petit Dragon, et que cette activité est tout aussi chronophage que mes activités sur ce blog (ce qui pose un problème puisque les journées n'ont que 24h). Mais je vais tenter de publier un autre article d'ici la fin du mois (et si j'en ai le temps, je tenterais d'être plus régulier à l'avenir).

Maintenant que tout est en ordre, attaquons le sujet du jour, et parlons justement de ces gestionnaires de mémoire. Je ne vais pas ici vous livrer le code d'un gestionnaire de mémoire ; inutile de me poser des questions sur les algorithmes à utiliser ; tout ceci est un problème d'implémentation, alors que pour une fois (étrange, me direz vous) c'est le coté fonctionnel et la vision architecturale qui m'intéresse. Incroyable, non ?

Lire la suite...

08 fév. 2011

Code source de jeux vidéo

Non, ce n'est pas un post qui va vous dire de télécharger tel ou tel jeu sous un prétexte quelconque - et surtout pas sous couvert d'une idéologie ou le libertarisme serait imposé ; chacun fait ce qu'il veut, après tout - c'est ça la liberté. Ce post a pour mission de recenser quelques jeux dont le code source est libre, parce que je suis en train d'en étudier certains afin d'en extraire ce qu'on nomme avec un amour révérencieux du cliché la substantifique moelle.

Nottez quand même que la plupart de ces jeux ne proposent que leur code - pour pouvoir jouer à ces jeux, il faudra quand même l'acheter afin de pouvoir installer les données du jeu. C'est normal : bien souvent, la réalisation de modèles 3D, des textures, des sprites et autres musique a nécessité plus de temps que le développement du code lui même. Il serait injuste de proffiter de tout ce temps sans en remercier d'une manière ou d'une autre les développeurs (il n'y a qu'à voir ce qui se passe actuellement avec Lugaru HD pour voir que tous ne partagent pas ma vision).

Mise à jour: ajout d'Alien Swarm (merci Dri) et Allegiance (merci Hydroxid Acid).

Lire la suite...

31 janv. 2011

[Code source] carray-0.3.0 (mise à jour)

carray est un petit utilitaire qui permet de générer un tableau C à partir d'un fichier quelconque. Je vous livre le code source de ce petit programme (ridiculement petit d'ailleurs), parce que je ne sais pas quoi en faire d'autre. Si vous avez des idées d'amélioration, n'hésitez pas !

Mise à jour: version 0.3.0 en téléchargement (prise en compte de la remarque de gilles sur EOF ; cf. son commentaire ci-dessous) Mise à jour: version 0.2.0 en téléchargement

Lire la suite...