 |
C++Talk.NET C++ language newsgroups
|
| View previous topic :: View next topic |
| Author |
Message |
Jean-Philippe Provost Guest
|
Posted: Mon Jul 12, 2004 1:55 am Post subject: [if] plusieurs variables.. |
|
|
Bonjour,
J'aimerais savoir comment je peut faire pour faire afficher le plus
petit et le plus grand de 3 nombres?
if ( nombre1 < nombre2, nombre3 )
Bref, vs comprenez le principe?
Dois-je faire cela 1 a 1 ou il existe un moyen (fonction) pour combiner
mes variables nombre*?
A++
|
|
| Back to top |
|
 |
foo Guest
|
Posted: Sat Jul 17, 2004 10:31 am Post subject: Re: [if] plusieurs variables.. |
|
|
Jean-Philippe Provost wrote:
| Quote: | Bonjour,
J'aimerais savoir comment je peut faire pour faire afficher le plus
petit et le plus grand de 3 nombres?
if ( nombre1 < nombre2, nombre3 )
Bref, vs comprenez le principe?
Dois-je faire cela 1 a 1 ou il existe un moyen (fonction) pour combiner
mes variables nombre*?
A++
|
std::cout << std::min(2, std::min(4, 1)) << std::endl;
std::cout << std::max(2, std::max(4, 1)) << std::endl;
|
|
| Back to top |
|
 |
Jean-Noël Mégoz Guest
|
Posted: Thu Jul 22, 2004 6:06 pm Post subject: Re: [if] plusieurs variables.. |
|
|
"foo" <foo (AT) spam (DOT) net> a écrit dans le message de
news:40f8ffd5$0$14576$636a15ce (AT) news (DOT) free.fr...
| Quote: | Jean-Philippe Provost wrote:
Bonjour,
J'aimerais savoir comment je peut faire pour faire afficher le plus
petit et le plus grand de 3 nombres?
if ( nombre1 < nombre2, nombre3 )
Bref, vs comprenez le principe?
Dois-je faire cela 1 a 1 ou il existe un moyen (fonction) pour combiner
mes variables nombre*?
A++
std::cout << std::min(2, std::min(4, 1)) << std::endl;
std::cout << std::max(2, std::max(4, 1)) << std::endl;
|
Je suis étonné que personne n'ai suggéré de les mettre dans un std::vector,
de le trier et de prendre les 1er et dernier éléments. )
|
|
| Back to top |
|
 |
drkm Guest
|
Posted: Thu Jul 22, 2004 9:04 pm Post subject: Re: [if] plusieurs variables.. |
|
|
"Jean-Noël Mégoz" <nospam_jnmegoz (AT) infonie (DOT) fr> writes:
| Quote: | Je suis étonné que personne n'ai suggéré de les mettre dans un std::vector,
de le trier et de prendre les 1er et dernier éléments. )
|
Le problème a été traité dans un fil voisin, il y a quelques jours.
--drkm, en recherche d'un stage : http://www.fgeorges.org/ipl/stage.html
|
|
| Back to top |
|
 |
Jean-Noël Mégoz Guest
|
Posted: Thu Sep 16, 2004 9:08 pm Post subject: Fly fucking optimization |
|
|
Salut !
Soit une variable i entière et initialisée.
Je veux que i soit impair. S'il est pair, je veux le ramener à l'impair
immédiatement inférieur. Je vois deux façons d'écrire ça :
-> if(i % 2 == 0) i--; // foin des accolades, c'est un exemple !
-> i -= 1 - (i % 2);
Je me demandais laquelle des solutions est la plus rapide à l'exécution ?
Cela dépend-il du compilateur ?
Déclarer i en int ou en long a-t-il un effet là-dessus ?
J.No.
|
|
| Back to top |
|
 |
Vincent Lascaux Guest
|
Posted: Thu Sep 16, 2004 9:41 pm Post subject: Re: Fly fucking optimization |
|
|
| Quote: | -> if(i % 2 == 0) i--; // foin des accolades, c'est un exemple !
-> i -= 1 - (i % 2);
Je me demandais laquelle des solutions est la plus rapide à l'exécution ?
|
Moi je pense que la premiere est de loin la plus comprehensible. Et je me
demande aussi si tu t'es bien demandé s'il n'y avait pas une autre partie du
code à optimiser qui te ferait gagner bien plus en rapidité que les quelques
instructions machines que tu vas gagner en changeant de méthode.
--
Vincent
|
|
| Back to top |
|
 |
Jean-Noël Mégoz Guest
|
Posted: Thu Sep 16, 2004 10:14 pm Post subject: Re: Fly fucking optimization |
|
|
"Vincent Lascaux" <nospam (AT) nospam (DOT) org> a écrit dans le message de
news:414a088e$0$20447$626a14ce (AT) news (DOT) free.fr...
| Quote: | -> if(i % 2 == 0) i--; // foin des accolades, c'est un exemple !
-> i -= 1 - (i % 2);
Je me demandais laquelle des solutions est la plus rapide à l'exécution
?
Moi je pense que la premiere est de loin la plus comprehensible.
|
Entièrement d'accord, et c'est d'ailleurs celle que j'ai écrite dans mon
code.
| Quote: | Et je me
demande aussi si tu t'es bien demandé s'il n'y avait pas une autre partie
du
code à optimiser qui te ferait gagner bien plus en rapidité que les
quelques
instructions machines que tu vas gagner en changeant de méthode.
|
Là aussi, j'approuve. Si je pose la question, c'est juste par curiosité !
D'où le titre de mon message... ;)
|
|
| Back to top |
|
 |
Philippe Guglielmetti Guest
|
Posted: Fri Sep 17, 2004 5:27 am Post subject: Re: Fly fucking optimization |
|
|
"Jean-Noël Mégoz" a écrit
| Quote: | Soit une variable i entière et initialisée.
Je veux que i soit impair. S'il est pair, je veux le ramener à
l'impair
immédiatement inférieur. Je vois deux façons d'écrire ça :
-> if(i % 2 == 0) i--; // foin des accolades, c'est un
exemple !
-> i -= 1 - (i % 2);
Je me demandais laquelle des solutions est la plus rapide à
l'exécution ? |
la seconde, et très nettement car il n'y a pas de test et donc pas de
rupture dans le flux d'instructions et donc le pipeline du proc reste
bien plein.
On peut d'ailleurs encore faire encore mieux: i-= 1-(i&1); qui ne
fait pas de division.
pour la lisibilité, tu peux faire:
i-= 1-(i&1); // force i pair à l'impair inférieur
| Quote: | Cela dépend-il du compilateur ?
non, je ne crois pas qu'il y ait des compilos assez malins pour |
"convertir" le source de la première méthode en exécutable sans test
et sans division.
| Quote: | Déclarer i en int ou en long a-t-il un effet là-dessus ?
sur les machines modernes, les int et les longs ont tous deux 32 bits |
: pas d'effet. si tes int font 16 bits, ca ira plus vite sur un proc
16 bits.
Philippe - www.goulu.net
|
|
| Back to top |
|
 |
Loïc Joly Guest
|
Posted: Fri Sep 17, 2004 6:07 am Post subject: Re: Fly fucking optimization |
|
|
Jean-Noël Mégoz wrote:
| Quote: | Salut !
Soit une variable i entière et initialisée.
Je veux que i soit impair. S'il est pair, je veux le ramener à l'impair
immédiatement inférieur. Je vois deux façons d'écrire ça :
-> if(i % 2 == 0) i--; // foin des accolades, c'est un exemple !
-> i -= 1 - (i % 2);
Je me demandais laquelle des solutions est la plus rapide à l'exécution ?
|
Celle qu'une mesure dans ton environnement aura montré être la plus rapide.
| Quote: | Cela dépend-il du compilateur ?
|
Peut-être. A confirmer par la mesure.
| Quote: | Déclarer i en int ou en long a-t-il un effet là-dessus ?
|
Peut-être. A confirmer par la mesure.
--
Loïc
|
|
| Back to top |
|
 |
kanze@gabi-soft.fr Guest
|
Posted: Fri Sep 17, 2004 6:58 am Post subject: Re: Fly fucking optimization |
|
|
"Jean-Noël Mégoz" <nospam_jnmegoz (AT) infonie (DOT) fr> wrote
| Quote: | Soit une variable i entière et initialisée. Je veux que i soit
impair. S'il est pair, je veux le ramener à l'impair immédiatement
inférieur. Je vois deux façons d'écrire ça :
-> if(i % 2 == 0) i--; // foin des accolades, c'est un exemple !
-> i -= 1 - (i % 2);
Je me demandais laquelle des solutions est la plus rapide à
l'exécution ? Cela dépend-il du compilateur ?
|
Ça dépend beaucoup du compilateur et du processeur. Il se peut que la
réponse ne soit pas la même sur un Pentium Pro que sur un Dimension, de
même qu'il peut dépendre du niveau de l'optimisation du compilateur.
Ceci dit, la solution classique serait plutôt :
i &= ~1 ;
d'après ce qu'il me semble. Solution qui risque aussi d'être la plus
rapide.
| Quote: | Déclarer i en int ou en long a-t-il un effet là-dessus ?
|
Là aussi, ça dépend. En revanche, avec la solution classique que j'ai
présenté, il faudrait se méfier -- ça doit marcher sur une machine
complémente à deux dans tous les cas, mais sur une architecture
magnitude signée, il vaudrait mieux que le 1 ait le même type que i.
--
James Kanze GABI Software http://www.gabi-soft.fr
Conseils en informatique orientée objet/
Beratung in objektorientierter Datenverarbeitung
9 place Sémard, 78210 St.-Cyr-l'École, France, +33 (0)1 30 23 00 34
|
|
| Back to top |
|
 |
Alexandre Bacquart Guest
|
Posted: Fri Sep 17, 2004 7:12 am Post subject: Re: Fly fucking optimization |
|
|
Jean-Noël Mégoz wrote:
| Quote: | Salut !
Soit une variable i entière et initialisée.
Je veux que i soit impair. S'il est pair, je veux le ramener à l'impair
immédiatement inférieur. Je vois deux façons d'écrire ça :
-> if(i % 2 == 0) i--; // foin des accolades, c'est un exemple !
|
1 modulo, 1 test, 1 décrémentation (éventuelle).
| Quote: | -> i -= 1 - (i % 2);
|
1 modulo, 2 soustractions.
| Quote: | Je me demandais laquelle des solutions est la plus rapide à l'exécution ?
|
Je pense que les 2 se valent, mais pour la rapidité, je préfère la
seconde car il n'y a pas de test (pipeline exploité) et son temps
d'exécution est fixe. Pour la lisibilité, je préfère la première.
| Quote: | Cela dépend-il du compilateur ?
|
S'il n'optimise pas, il va faire le modulo (donc une division). Et dans
le premier cas, je ne pense pas qu'il y ait beaucoup de compilos
capables d'optimiser un if(), même aussi simple que celui-ci. Mais
aujourd'hui comme hier il n'y a pas 36 façons d'optimiser ça pour les
entiers :
i -= (i & 1) ^ 1; // pas très propre
Ca évite le modulo. Je te conseille quand-même de n'utiliser ça que si
le compilo n'optimise pas et que c'est du code critique. Et j'espère que
tu n'oublies pas le cas i == 0 aussi.
| Quote: | Déclarer i en int ou en long a-t-il un effet là-dessus ?
|
En termes de vitesse ? si l'implémentation fait que
sizeof(int)!=sizeof(long), cela dépend alors de la plateforme mais dans
ce cas, en principe (mais pas forcément) int est l'entier "idéal".
--
Tek
|
|
| Back to top |
|
 |
Richard Delorme Guest
|
Posted: Fri Sep 17, 2004 7:14 am Post subject: Re: Fly fucking optimization |
|
|
Philippe Guglielmetti a écrit :
| Quote: | "Jean-Noël Mégoz" a écrit
Soit une variable i entière et initialisée.
Je veux que i soit impair. S'il est pair, je veux le ramener à
l'impair
immédiatement inférieur. Je vois deux façons d'écrire ça :
-> if(i % 2 == 0) i--; // foin des accolades, c'est un
exemple !
-> i -= 1 - (i % 2);
Je me demandais laquelle des solutions est la plus rapide à
l'exécution ?
la seconde, et très nettement car il n'y a pas de test et donc pas de
rupture dans le flux d'instructions et donc le pipeline du proc reste
bien plein.
On peut d'ailleurs encore faire encore mieux: i-= 1-(i&1); qui ne
fait pas de division.
pour la lisibilité, tu peux faire:
i-= 1-(i&1); // force i pair à l'impair inférieur
|
Ce n'est pas évident, les CPU modernes ont une instruction pour
effectuer des MOV conditionnels, et g++ en profite sur mon athlon, voilà
l'assembleur qu'il produit, dans les trois cas :
g++ -O2 -frame-omit-pointer -march=athlon-XP
// if (i % 2 == 0) i--;
movl 4(%esp), %eax // %eax = i
leal -1(%eax), %edx // %edx = i-1
testb $1, %al // %eax est impair ?
cmove %edx, %eax // %eax = %edx
// if i -= 1 - (i % 2);
movl 4(%esp), %eax
movl %eax, %edx
movl %eax, %ecx //
shrl $31, %edx // Calcul compliqué
leal (%edx,%eax), %edx // de (i % 2 == 0)
andl $-2, %edx //
subl %edx, %ecx
leal -1(%ecx,%eax), %eax
// if i -= 1 - (i & 1);
movl 4(%esp), %eax // %eax = i
andl $1, %eax // %eax &= 1
addl 4(%esp), %eax // %eax += i
decl %eax // %eax -=1
A mon avis, mais je n'ai pas mesuré, la première forme est la plus
rapide, car le CPU peut sans doute effectuer les instructions 2 et 3 en
parallèle.
S'abtenir de toute optimisation manuelle est, sur cet exemple
particulier et comme bien souvent, la solution la plus rapide. J'en
profite pour rappeler les trois points fondamentaux de l'optimisation :
1 - Ne pas optimiser
2 - Ne pas optimiser
3 - Pour expert seulement : ne pas optimiser encore.
| Quote: | Cela dépend-il du compilateur ?
non, je ne crois pas qu'il y ait des compilos assez malins pour
"convertir" le source de la première méthode en exécutable sans test
et sans division.
|
Si, il y a au moins g++, icc (Intel C/C++ compiler), et sans doute la
plupart des compilateurs actuels.
--
Richard
|
|
| Back to top |
|
 |
Jean-Marc Bourguet Guest
|
|
| Back to top |
|
 |
Alexandre Bacquart Guest
|
Posted: Fri Sep 17, 2004 7:19 am Post subject: Re: Fly fucking optimization |
|
|
[email]kanze (AT) gabi-soft (DOT) fr[/email] wrote:
| Quote: | i &= ~1 ;
d'après ce qu'il me semble. Solution qui risque aussi d'être la plus
rapide.
|
Mmh, cela ne fait pas exactement ce que demande l'OP.
| Quote: | Déclarer i en int ou en long a-t-il un effet là-dessus ?
Là aussi, ça dépend. En revanche, avec la solution classique que j'ai
présenté, il faudrait se méfier -- ça doit marcher sur une machine
complémente à deux dans tous les cas, mais sur une architecture
magnitude signée, il vaudrait mieux que le 1 ait le même type que i.
|
Moi personnellement, je pense qu'il faut toujours se méfier des
manipulations de bits en C et C++.
--
Tek
|
|
| Back to top |
|
 |
Alexandre Bacquart Guest
|
Posted: Fri Sep 17, 2004 7:24 am Post subject: Re: Fly fucking optimization |
|
|
Vincent Lascaux wrote:
| Quote: | -> if(i % 2 == 0) i--; // foin des accolades, c'est un exemple !
-> i -= 1 - (i % 2);
Je me demandais laquelle des solutions est la plus rapide à l'exécution ?
Moi je pense que la premiere est de loin la plus comprehensible. Et je me
demande aussi si tu t'es bien demandé s'il n'y avait pas une autre partie du
code à optimiser qui te ferait gagner bien plus en rapidité que les quelques
instructions machines que tu vas gagner en changeant de méthode.
|
Quand le code en question est susceptible d'être executé des millions de
fois par seconde, on ne fait pas le même raisonnement.
--
Tek
|
|
| Back to top |
|
 |
|
|
You cannot post new topics in this forum You cannot reply to topics in this forum You cannot edit your posts in this forum You cannot delete your posts in this forum You cannot vote in polls in this forum
|
|