"Antoine Leca" a écrit dans le message de
news: f3714j$afd$En news:f36acg$tkk$, Laurent Deniau écrivit:Je suis pas certain que le dernier
switch() d'Antoine soit plus rapide parce qu'on a perdu la linearite
des labels ce qui risque de se traduire par autant de tests que de
cases, et donc sous optimal par rapport a la dichotomie explicite.
Mon idée (mais je n'ai pas testé) c'est que ce switch est plein,
donc le compilateur va le remplacer par un goto calculé, en principe
plus rapide qu'une cascade de 3 tests.
Ton switch est tout sauf plein : les case values ne sont pas
contiguës, loin s'en faut, il a de fortes chances d'être compilé
comme une suite de tests (quand meme dichotomiques avec un bon
compilo).
Le code de Pascal Bourguignon est très instructif en la matière
bitcount et atoi sont mes tests favoris lors d'un entretien
d'embauche pour un programmeur, j'ai un musée des horreurs où la
collection se renouvelle régulièrement, il est rare que j'aie
l'opportunité de faire analyser le bitcount par addition parallèle
qu'utilise PB (ce serait sadique), et jusqu'à présent personne ne l'a
proposé d'emblée (ce serait génial).
"Antoine Leca" <root@localhost.invalid> a écrit dans le message de
news: f3714j$afd$1@shakotay.alphanet.ch...
En news:f36acg$tkk$1@cernne03.cern.ch, Laurent Deniau écrivit:
Je suis pas certain que le dernier
switch() d'Antoine soit plus rapide parce qu'on a perdu la linearite
des labels ce qui risque de se traduire par autant de tests que de
cases, et donc sous optimal par rapport a la dichotomie explicite.
Mon idée (mais je n'ai pas testé) c'est que ce switch est plein,
donc le compilateur va le remplacer par un goto calculé, en principe
plus rapide qu'une cascade de 3 tests.
Ton switch est tout sauf plein : les case values ne sont pas
contiguës, loin s'en faut, il a de fortes chances d'être compilé
comme une suite de tests (quand meme dichotomiques avec un bon
compilo).
Le code de Pascal Bourguignon est très instructif en la matière
bitcount et atoi sont mes tests favoris lors d'un entretien
d'embauche pour un programmeur, j'ai un musée des horreurs où la
collection se renouvelle régulièrement, il est rare que j'aie
l'opportunité de faire analyser le bitcount par addition parallèle
qu'utilise PB (ce serait sadique), et jusqu'à présent personne ne l'a
proposé d'emblée (ce serait génial).
"Antoine Leca" a écrit dans le message de
news: f3714j$afd$En news:f36acg$tkk$, Laurent Deniau écrivit:Je suis pas certain que le dernier
switch() d'Antoine soit plus rapide parce qu'on a perdu la linearite
des labels ce qui risque de se traduire par autant de tests que de
cases, et donc sous optimal par rapport a la dichotomie explicite.
Mon idée (mais je n'ai pas testé) c'est que ce switch est plein,
donc le compilateur va le remplacer par un goto calculé, en principe
plus rapide qu'une cascade de 3 tests.
Ton switch est tout sauf plein : les case values ne sont pas
contiguës, loin s'en faut, il a de fortes chances d'être compilé
comme une suite de tests (quand meme dichotomiques avec un bon
compilo).
Le code de Pascal Bourguignon est très instructif en la matière
bitcount et atoi sont mes tests favoris lors d'un entretien
d'embauche pour un programmeur, j'ai un musée des horreurs où la
collection se renouvelle régulièrement, il est rare que j'aie
l'opportunité de faire analyser le bitcount par addition parallèle
qu'utilise PB (ce serait sadique), et jusqu'à présent personne ne l'a
proposé d'emblée (ce serait génial).
En news:,
Pascal Bourguignon va escriure:Sinon, c'est plus simple de les enlever que de les compter:
int remove_ones_on_right(int bitfield){
/*
0101011111111
+1 0101100000000
xor 0000111111111
shift 0000011111111
- 0101000000000
*/
assert(bitfield>0);
return(bitfield-((bitfield^(bitfield+1))>>1));
}
Une fois que tu es arrivé là, on peut compter facilement, non ?
int compter_les_uns_à_droite(int trame){
/*0101011111111
+1 0101100000000
xor 0000111111111
shift 0000011111111
- 0101000000000
*/
assert(trame>0);
switch((trame^(trame+1))>>1){
En news:873b1llm8f.fsf@thalassa.lan.informatimago.com,
Pascal Bourguignon va escriure:
Sinon, c'est plus simple de les enlever que de les compter:
int remove_ones_on_right(int bitfield){
/*
0101011111111
+1 0101100000000
xor 0000111111111
shift 0000011111111
- 0101000000000
*/
assert(bitfield>0);
return(bitfield-((bitfield^(bitfield+1))>>1));
}
Une fois que tu es arrivé là, on peut compter facilement, non ?
int compter_les_uns_à_droite(int trame){
/*
0101011111111
+1 0101100000000
xor 0000111111111
shift 0000011111111
- 0101000000000
*/
assert(trame>0);
switch((trame^(trame+1))>>1){
En news:,
Pascal Bourguignon va escriure:Sinon, c'est plus simple de les enlever que de les compter:
int remove_ones_on_right(int bitfield){
/*
0101011111111
+1 0101100000000
xor 0000111111111
shift 0000011111111
- 0101000000000
*/
assert(bitfield>0);
return(bitfield-((bitfield^(bitfield+1))>>1));
}
Une fois que tu es arrivé là, on peut compter facilement, non ?
int compter_les_uns_à_droite(int trame){
/*0101011111111
+1 0101100000000
xor 0000111111111
shift 0000011111111
- 0101000000000
*/
assert(trame>0);
switch((trame^(trame+1))>>1){
En news:465b6fdc$0$3630$,
Charlie Gordon va escriure:Le code de Pascal Bourguignon est très instructif en la matière
Oui. Je dois dire que j'ai lu son article après avoir posté le mien, mais
qu'il m'a impressionné.
Maintenant, cela illustre deux approches très différentes (et généralement
complémentaires) de l'optimisation : l'une est de chercher à optimiser à
fond l'algorithme actuel, économiser le quart de cycle là où c'est
possible
; l'autre est de repenser le problème en cherchant un autre algorithme.
bitcount et atoi sont mes tests favoris lors d'un entretien
d'embauche pour un programmeur, j'ai un musée des horreurs où la
collection se renouvelle régulièrement, il est rare que j'aie
l'opportunité de faire analyser le bitcount par addition parallèle
qu'utilise PB (ce serait sadique), et jusqu'à présent personne ne l'a
proposé d'emblée (ce serait génial).
Mouais. ÀMHA, celui qui te le propose d'emblée, ce n'est pas un génie (car
il n'aurait en fait rien à faire dans ton entretien, désolé mais c'est
comme
cela), mais plutôt quelqu'un qui a planché sur le sujet dans son contrat
précédent.
Par contre, dorénavant, celui qui est capable de te ressortir cela si tu
lui
laisses 1 heure (et une station avec accès internet) pour rme ésoudre le
problème, celui-là est intéressant parce que cela veut dire qu'il est
capable de savoir utiliser *efficacement* Google groups :-)))
En news:465b6fdc$0$3630$426a74cc@news.free.fr,
Charlie Gordon va escriure:
Le code de Pascal Bourguignon est très instructif en la matière
Oui. Je dois dire que j'ai lu son article après avoir posté le mien, mais
qu'il m'a impressionné.
Maintenant, cela illustre deux approches très différentes (et généralement
complémentaires) de l'optimisation : l'une est de chercher à optimiser à
fond l'algorithme actuel, économiser le quart de cycle là où c'est
possible
; l'autre est de repenser le problème en cherchant un autre algorithme.
bitcount et atoi sont mes tests favoris lors d'un entretien
d'embauche pour un programmeur, j'ai un musée des horreurs où la
collection se renouvelle régulièrement, il est rare que j'aie
l'opportunité de faire analyser le bitcount par addition parallèle
qu'utilise PB (ce serait sadique), et jusqu'à présent personne ne l'a
proposé d'emblée (ce serait génial).
Mouais. ÀMHA, celui qui te le propose d'emblée, ce n'est pas un génie (car
il n'aurait en fait rien à faire dans ton entretien, désolé mais c'est
comme
cela), mais plutôt quelqu'un qui a planché sur le sujet dans son contrat
précédent.
Par contre, dorénavant, celui qui est capable de te ressortir cela si tu
lui
laisses 1 heure (et une station avec accès internet) pour rme ésoudre le
problème, celui-là est intéressant parce que cela veut dire qu'il est
capable de savoir utiliser *efficacement* Google groups :-)))
En news:465b6fdc$0$3630$,
Charlie Gordon va escriure:Le code de Pascal Bourguignon est très instructif en la matière
Oui. Je dois dire que j'ai lu son article après avoir posté le mien, mais
qu'il m'a impressionné.
Maintenant, cela illustre deux approches très différentes (et généralement
complémentaires) de l'optimisation : l'une est de chercher à optimiser à
fond l'algorithme actuel, économiser le quart de cycle là où c'est
possible
; l'autre est de repenser le problème en cherchant un autre algorithme.
bitcount et atoi sont mes tests favoris lors d'un entretien
d'embauche pour un programmeur, j'ai un musée des horreurs où la
collection se renouvelle régulièrement, il est rare que j'aie
l'opportunité de faire analyser le bitcount par addition parallèle
qu'utilise PB (ce serait sadique), et jusqu'à présent personne ne l'a
proposé d'emblée (ce serait génial).
Mouais. ÀMHA, celui qui te le propose d'emblée, ce n'est pas un génie (car
il n'aurait en fait rien à faire dans ton entretien, désolé mais c'est
comme
cela), mais plutôt quelqu'un qui a planché sur le sujet dans son contrat
précédent.
Par contre, dorénavant, celui qui est capable de te ressortir cela si tu
lui
laisses 1 heure (et une station avec accès internet) pour rme ésoudre le
problème, celui-là est intéressant parce que cela veut dire qu'il est
capable de savoir utiliser *efficacement* Google groups :-)))
Je pense qu'un programmeur C correctement câblé peut résoudre ça sans
difficulté, mais dans le monde réel, le taux de chute est proche de 100%,
même avec plus de temps.
Je pense qu'un programmeur C correctement câblé peut résoudre ça sans
difficulté, mais dans le monde réel, le taux de chute est proche de 100%,
même avec plus de temps.
Je pense qu'un programmeur C correctement câblé peut résoudre ça sans
difficulté, mais dans le monde réel, le taux de chute est proche de 100%,
même avec plus de temps.
Oui ! D'ailleurs, c'est exactement ce que je me suis dit suite au post de
Bruno Causse qui propose un autre algorithme avec un modulo... Je fais >
encore des tests, mais je pense pouvoir faire plus rapide que sa
proposition en 64 bits ;-)
Oui ! D'ailleurs, c'est exactement ce que je me suis dit suite au post de
Bruno Causse qui propose un autre algorithme avec un modulo... Je fais >
encore des tests, mais je pense pouvoir faire plus rapide que sa
proposition en 64 bits ;-)
Oui ! D'ailleurs, c'est exactement ce que je me suis dit suite au post de
Bruno Causse qui propose un autre algorithme avec un modulo... Je fais >
encore des tests, mais je pense pouvoir faire plus rapide que sa
proposition en 64 bits ;-)
Bonsoir.
Je cherche à optimiser une (pas si) bête opération de recherche de bit dans
un nombre entier.
[...]
Le but est d'extraire le nombre de 1 jointifs à droite, ou bien (c'est
équivalent) le rang du premier 0 à droite.
Dans cet exemple: 7
Un sous-problème peut être d'éliminer les 1 de la partie gauche...
Bonsoir.
Je cherche à optimiser une (pas si) bête opération de recherche de bit dans
un nombre entier.
[...]
Le but est d'extraire le nombre de 1 jointifs à droite, ou bien (c'est
équivalent) le rang du premier 0 à droite.
Dans cet exemple: 7
Un sous-problème peut être d'éliminer les 1 de la partie gauche...
Bonsoir.
Je cherche à optimiser une (pas si) bête opération de recherche de bit dans
un nombre entier.
[...]
Le but est d'extraire le nombre de 1 jointifs à droite, ou bien (c'est
équivalent) le rang du premier 0 à droite.
Dans cet exemple: 7
Un sous-problème peut être d'éliminer les 1 de la partie gauche...
Pour les détails techniques on pourra lire :
ftp://theory.lcs.mit.edu/pub/cilk/debruijn.ps.gz
http://www.prism.gatech.edu/~gtg365v/Buzz/research/magic/Bitboards.pdf
A l'attention plus personnel de Bruno Causse, qui semble lire ce fil, je
tiens à préciser que le principe algorithmique des "coups magiques"
développé dans ce dernier article fonctionne aussi pour le jeu d'Othello.
Pour les détails techniques on pourra lire :
ftp://theory.lcs.mit.edu/pub/cilk/debruijn.ps.gz
http://www.prism.gatech.edu/~gtg365v/Buzz/research/magic/Bitboards.pdf
A l'attention plus personnel de Bruno Causse, qui semble lire ce fil, je
tiens à préciser que le principe algorithmique des "coups magiques"
développé dans ce dernier article fonctionne aussi pour le jeu d'Othello.
Pour les détails techniques on pourra lire :
ftp://theory.lcs.mit.edu/pub/cilk/debruijn.ps.gz
http://www.prism.gatech.edu/~gtg365v/Buzz/research/magic/Bitboards.pdf
A l'attention plus personnel de Bruno Causse, qui semble lire ce fil, je
tiens à préciser que le principe algorithmique des "coups magiques"
développé dans ce dernier article fonctionne aussi pour le jeu d'Othello.
Patrick 'Zener' Brunet wrote:"Patrick 'Zener' Brunet" a écrit
dans
le message news: f34nr2$oi5$Je cherche à optimiser une (pas si) bête opération de recherche
de bit [...]
Ben voilà, j'ai un beau tableau creux maintenant, qui doit donc
rester virtuel.
Il me reste donc à me pencher sur les Patricia trees :-)
Et peut-etre regarder les "Judy Array" qui font exactement ca, non?
http://judy.sourceforge.net/
Patrick 'Zener' Brunet wrote:
"Patrick 'Zener' Brunet" <use.link.in.signature@ddress.invalid> a écrit
dans
le message news: f34nr2$oi5$1@shakotay.alphanet.ch...
Je cherche à optimiser une (pas si) bête opération de recherche
de bit [...]
Ben voilà, j'ai un beau tableau creux maintenant, qui doit donc
rester virtuel.
Il me reste donc à me pencher sur les Patricia trees :-)
Et peut-etre regarder les "Judy Array" qui font exactement ca, non?
http://judy.sourceforge.net/
Patrick 'Zener' Brunet wrote:"Patrick 'Zener' Brunet" a écrit
dans
le message news: f34nr2$oi5$Je cherche à optimiser une (pas si) bête opération de recherche
de bit [...]
Ben voilà, j'ai un beau tableau creux maintenant, qui doit donc
rester virtuel.
Il me reste donc à me pencher sur les Patricia trees :-)
Et peut-etre regarder les "Judy Array" qui font exactement ca, non?
http://judy.sourceforge.net/