Faisons des petits sablés pour la St Valentin !
Aujourd'hui c'est le jour avant la Saint Valentin. Ca veut dire que c'est le jour où on fait un truc stupide pour pouvoir dire à sa chérie : "tu as vu j'ai pensé à toi !" et après elle dit : "Oh c'est trop mignon !". On a pas forcement le coeur à ça comme le dit si bien xkcd. Mais pour une fois j'ai envie de faire ca bien et ma chérie à adoré les "Petit Ecoliers de LU"(TM). Mon plan pour demain est : Petit sablé au chocolat.
En faire une vingtaine m'a pris de l'ordre d'une heure et demi. C'est à moduler avec le fait que je savais deja faire une pate sablé et que je manque de matériel.
Pour commencer il faut faire une pate sablé. On trouve des tonnes de recettes sur le net mais celle que j'ai utilisé est la suivante. Dans un saladier on met 130g de farine, une pincé de sel. On rajoute 100g de beurre coupé en petit bout (mais pas fondu). On met de l'ordre de 100g de sucre. J'ai utilisé une moitié de sucre au citron et une moitié de sucre normal. Une fois que l'on a mis tout ca dans le saladier, il faut melanger en ecrasant le beurre pour qu'il ne soit plus possible de distinguer le beurre de la farine et du sucre. Ca fait un genre de poudre comme si on avait effrité un quatre quart. Pour finir la pate sablé, on rajoute un oeuf et on petrit la tout pour obtenir une pate uniforme (On ne met pas d'eau dans une pate sablé !).
Une fois que l'on a notre boule de pate on va l'etaller comme pour faire une tarte. On farine un plan de travail et un rouleau à patisserie. Puis on étale la pate. Comme on ne compte pas faire une tarte, on s'en fout un peu que ca soit rond. Mais c'est toujours efficace de l'étaler dans plusieurs directions.
Une fois que la pate est étalé, on découpe des biscuits avec un emporte pièce. Si on en a un en forme de coeur, c'est cool. Perso, j'ai fait ca avec un verre. On pose le verre tete en bas sur la pate et on le tourne jusqu'a séparer un cercle parfait. On met le furtur biscuit de cote et on recommence. Attention à ne pas empiler les futurs biscuits; comme ils ne sont pas encore cuits, ils vont coller entr eux. Comme on ne peut pas utiliser toute la pate en une fois, il faut replier ce qui reste de pate, refaire une boule et recommencer. A chaque fois il faut rajouter de la farine et la pate peut devenir trop seche, l'humidifier peut aider à ce qu'elle ne se brise pas.
C'est un bon moment pour allumer le four a 200
Celsius. Pendant qu'il chauffe on va preparer le chocolat. On met
du chocolat dans une casserole. J'ai utilisé 2 carrés de chocolat
noir Ghirardelli (extra noir 80% de cacao de la taille des carrés
de Lindt) et de l'ordre de 80g de pépite chocolat à cookie. On fait fondre le choloat mais sans le faire bruler. Quand le chocolat a commencé à fondre, j'ai rajouté de l'extrait d'orange (C'est un peu plus bourrin que la fleur d'oranger, mais je n'en avais pas). On peut gouter le chocolat pour savoir si on a mis ce qu'il fallait dedans. (Le chocolat fondu ce n'est pas chaud; ce n'est pas du caramel. Non je ne pense à personne en particulier quand je dis ca !? )
Pendant que le chocolat fond, le four doit être chaud, et c'est le bon moment pour enfourner nos petits sablés. Perso je l'ai ai mis dans des plats à tarte (en 2 fournés parceque je n'en avait pas assez). Quand les petits sablé sont un peu cuit, on les retourne. On sait qu'ils sont assez cuits parcequ'on arrive à les faire glisser à l'interieur du plat (comme les crèpes en fait ! ). On les cuits de l'autre cote. La cuisson est assez rapide, je n'ai pas chronomètre, mais je dirais de l'ordre de 7 minutes sur la premiere face et 3 minutes sur l'autre face.
On retire les petits sablé du four pour pouvoir mettre le chocolat fondu dessus. On fait ca relativement facilement en utilisant l'arrière d'une cuillière. Utiliser les bords du plat à tarte est utile pour ne pas avoir à toucher les petits sablés qui sont brulants. Personnellement, je prefere avoir des petits sables fins avec une fine couche de chocolat. Comme ca, on peut en faire plus.
On remet les petits sablés dans le four pour que le chocolat cuise. Si la couche de chocolat est fine, cela ne prends que quelque minutes.
Finalement, on retire les petits sablé du four et on les mets dans une boite, ou si vous avez oublié (comme moi), on les met dans une assiètte. Regardez comme c'est joli !
Bon j'espère que ma chérie va apprecier. Bilan : 1h30 a les preparer et les cuire ( J'ai du faire deux fournés et j'ai essayer de mettre le chocolat sur le sablé pas cuit, mais ce n'est pas aussi bien) et 1h a écrire ce poste de blog.
Quand les conteneurs standards deviennent trop lents
Aujourd'hui j'ai envie de parler d'optimisation de code et plus
précisément d'un cas particulier qui m'est arrivé lors de l'écriture
de QixDS
. Pour résumer : des balles se déplacent dans l'écran et le
joueur fait apparaître des murs afin d'enfermer les balles dans un
espace le plus restreint possible.
Lorsque le joueur fait apparaître un mur, le jeu vérifie si une
zone de l'écran ne contient aucune balle. Si une telle zone existe, le
jeu la rempli entièrement. Le code responsable de cette
fonctionnalité était relativement lent. En fait, il faisait baisser le
framerate. L'algorithme qui fait cela est un algorithme de recherche
de composante connexe dans un graphe qui ressemble basiquement à:
Pile p;
Marque = false;
Case c = (x,y);
p.empiler ();
Marque[c] = true;
Tant que (! p.vide())
{
Case c = p.depiler();
Pour chaque voisin v de c
{
Si (Marque[c] == false ET ! c.estUnMur())
{
p.empiler(c);
Marque[c]=true;
}
}
}
On peut voir que ce code est intensif sur la Pile. Dans
l'implémentation lente, la pile était std::stack de la STL. La stack
de la STL est implementée au dessus d'une deque. Je me suis dit que
la deque de la STL se redimensionne automatiquement et que donc elle
fait des vérifications d'accès à chaque insertion qui sont
superflues. En l'occurence, je sais que le nombre maximal d'objets
qui seront dans la pile est inférieur aux nombres de cases dans mon
jeu. Ce nombre étant petit par rapport à la taille de la mémoire, je
peux allouer toute la mémoire une bonne fois pour toute et supprimer
toutes les vérifications d'accès à la pile.
J'ai donc remplacé la pile de la STL par une pile ad hoc
qui alloue la mémoire que demande le programmeur à la construction
et qui ne fait pas de vérifications sur les bornes du tableau. En
effet, si le programmeur fait une utilisation correcte de la pile,
ces vérifications sont inutiles.
Quand je raconte ça, les gens sont toujours un petit peu
sceptique. Je fournis donc aujourd'hui des tests montrant qu'une
telle implémentation est plus rapide que celle (plus générique) de
la STL. Le code de test
est disponible. Basiquement,
il s'agit d'empiler 228 entiers ( soit 268 millions
d'entiers ) sur la pile en garantissant que la pile sera toujours de
taille inférieur à 28.
Quatre implémentations différentes sont maintenant
présentées. Tout d'abord
StlStack est l'implémentation utilisant std::stack de la
STL. Pile est
l'implémentation décrite précédemment : la mémoire est allouée à la
création de l'objet et aucune vérification n'est faite a
posteriori.
PileSafe ajoute les vérifications de bornes sur le tableau (un
test par accès à la structure en plus par rapport à
Pile). Finalement,
PileTemplate connaît la taille du tableau à la compilation et
retire ainsi l'allocation dynamique de la mémoire du tableau et,
ainsi, une indirection.
Les quatre implémentations sont testées sur 4 machines différentes
(Merci chris_27 et dargor pour les tests). Les quatre machines
utilisent g++ et le code est compilé en -O2 -DNDEBUG. Les mesures de
temps sont faites avec time. Une seule mesure de temps est fournie
par test mais les valeurs sont cohérente d'un run à l'autre. Les
résultats sont présentés dans le tableau ci-dessous:
Machine | ThinkPad | Tarsonis | EEEbox
B202 | Aspire One |
| Processeur | Intel(R) Core(TM)2 Duo CPU T7500 @
2.20GHz
| Genuine Intel(R) CPU T2130 @ 1.86GHz | Intel(R)
Atom(TM) CPU N270 @ 1.60GHz
| Intel(R) Atom(TM) CPU N270 @ 1.60GHz ("GenuineIntel"
686-class) 1.60 GHz (downclocked to 800Mhz ) |
| Compilateur | g++ (Debian 4.3.2-1.1) 4.3.2 | g++
(Debian 4.3.4-6) 4.3.4 | g++ (Debian 4.3.2-1.1)
4.3.2 | g++ (GCC) 3.3.5 (propolice) |
| StlStack | 2.14s | 15.56s | 14.24s | 22.01s |
| Pile | 1.42s | 7.34s | 8.19s | 11.47s |
| PileSafe | 1.40s | 6.48s | 11.88s | 15.65s |
| PileTemplate | 1.44s | 7.66s | 8.51s | 8.33s |
Les résultats montrent que l'implémentation manuelle Pile sans
vérifications est toujours plus rapide que l'implémentation de la STL
(de 25% à 50% en fonction de la machine).
La comparaison de Pile, PileSafe et PileTemplate est par contre
plus étonnante. On s'attendrait à ce que PileTemplate soit plus
rapide que Pile (puisqu'il y a une indirection de moins dans
PileTemplate). Et que Pile soit plus rapide que PileSafe (puisqu'il
y a un test en plus dans PileSafe). Cependant sur ThinkPad
et Tarsonis, PileSafe est l'implémentation la plus rapide et
PileTemplate est l'implémentation la plus lente (les temps de calcul
sur ThinkPad sont faibles mais l'ordre ne change pas si on augmente
le nombre de calcul). En revanche, PileSafe est plus lent que Pile
sur EEEboxB202 et AspireOne. PileTemplate est sensiblement plus
rapide que Pile sur AspireOne et légèrement plus lent sur
EEEboxB202.
D'où viennent ces différences de performances ? Est-ce que l'ordre
est correct sur les machines EEEboxB202 et AspireOne parce qu'ils
utilisent des processeur Atom et que les processeurs plus classiques
de ThinkPad et Tarsonis ont des optimisations internes plus erratique
? Les résultats de AspireOne correspondent à nos attentes mais ont
été obtenus sur une ancienne version de gcc. Est ce que les nouvelles
versions de gcc lissent les différences ?
Finalement, PileSafe obtient de meilleurs résultats que
l'implémentation de la STL. On aurait attendu que les deux
implémentations aient à peu près les mêmes performances. Cela semble
indiquer que l'implémentation de la STL fournit une fonctionnalité
supplémentaire. Dans tous les cas, il semble clair que reimplémenter
des structures de données pour un cas particulier peut améliorer
les performances d'un programme. Les différences peuvent ne pas
sembler très probantes sur des processeurs efficaces comme les
dernières générations d'Intel, mais elles ont clairement fait la
différence sur ARM9 dans QixDS.
La video de ma soutenance
Ca fait presque un an que j'ai soutenu ma these, mais je n'ai
jamais mis la video de ma soutenance a disposition. Merci Delphine
d'avoir pris la video (et de l'avoir retouche). Je ne l'ai pas
regarder encore, mais j'ai cru comprendre que j'avais dit pas mal
d'anerie sous le coup du stress ce jour la.
la video. (Oui, je
sais que la video est en wmv, mais je suis sur que vous vous
debrouillerez tres bien avec)
PS: j'ai un upload assez faible. Donc c'est normal si ca prend du
temps.
La magie des front end
Soki m'avait demande une demo du code que j'ai ecrit pour mon Nokia n810 le week
end dernier. J'avais promis que j'en ferait une, mais j'ai eu d'autre
chats a fouetter cette semaine. Mais bon, chose promise chose due.
Le n810 fonctionne sur maemo (une
distribution linux fournie par Nokia); l'api graphique est GTK/Hildon
et il faudrait adapter le code un chouia pour que ca marche sur Linux
classique. Donc j'ai fait une video (encode bizarre mais ca
marche dans mplayer) avec un emulateur de maemo pour donner une
idee de comment ca marche. (On ne se moque pas, c'est assez bizarre de
parler devant son ordinateur sans personne qui ecoute en directe.)
Le code C.
Ouverture
Bonjour a vous et bienvenu sur mon 'blog'.
Je voulais a la base ecrire un blog pour tenir les gens informes de
ma vie aux USA, mais finalement j'ai glande et je ne l'ai mis en ligne
qu'aujourd'hui (27 aout). Ca fait 8 mois que j'y suis et j'ai donc un
peu moins de chose a vous raconter a ce propos. Par contre, j'ai
toujours besoin d'un endroit ou poser des informations, des
geekeries... Donc j'ouvre finalement mon 'blog' quand meme.
Quelques informations sur le 'blog' en general. Vous devez savoir
que j'aime bien faire les choses a la main, c'est pour ca que le blog
est assez sobre (certain dirait minimalistes meme). Vous devez aussi
vous douter que j'utilise un clavier qwerty donc ca veut dire que
j'ecris sans accent.
Vous avez la possibilite de poster des commentaires. Je ne compte
pas moderer les commentaires et je ne compte pas non plus faire de
compte utilisateurs, ca veut dire que vous pouvez dire n'importe quoi
et le signer avec n'importe quel nom. Mais j'ai confiance en vous, je
sais que vous ne ferez pas de connerie (de toute facon j'ai les logs
:) ). Il y a potentiellement des gens de plusieurs communautes qui
liront ce blog, donc essayez d'eviter les commentaires acerbes
:).
Bon blogage