C++Talk.NET Forum Index C++Talk.NET
C++ language newsgroups
 
Archives   FAQFAQ   SearchSearch   MemberlistMemberlist   UsergroupsUsergroups   RegisterRegister 
 ProfileProfile   Log in to check your private messagesLog in to check your private messages   Log inLog in 

[if] plusieurs variables..
Goto page 1, 2, 3  Next
 
Post new topic   Reply to topic    C++Talk.NET Forum Index -> C++ (French)
View previous topic :: View next topic  
Author Message
Jean-Philippe Provost
Guest





PostPosted: Mon Jul 12, 2004 1:55 am    Post subject: [if] plusieurs variables.. Reply with 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++
Back to top
foo
Guest





PostPosted: Sat Jul 17, 2004 10:31 am    Post subject: Re: [if] plusieurs variables.. Reply with quote



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





PostPosted: Thu Jul 22, 2004 6:06 pm    Post subject: Re: [if] plusieurs variables.. Reply with quote




"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. Wink)



Back to top
drkm
Guest





PostPosted: Thu Jul 22, 2004 9:04 pm    Post subject: Re: [if] plusieurs variables.. Reply with quote

"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. Wink)

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





PostPosted: Thu Sep 16, 2004 9:08 pm    Post subject: Fly fucking optimization Reply with 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 ?
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





PostPosted: Thu Sep 16, 2004 9:41 pm    Post subject: Re: Fly fucking optimization Reply with quote

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





PostPosted: Thu Sep 16, 2004 10:14 pm    Post subject: Re: Fly fucking optimization Reply with quote


"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





PostPosted: Fri Sep 17, 2004 5:27 am    Post subject: Re: Fly fucking optimization Reply with quote

"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





PostPosted: Fri Sep 17, 2004 6:07 am    Post subject: Re: Fly fucking optimization Reply with quote

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





PostPosted: Fri Sep 17, 2004 6:58 am    Post subject: Re: Fly fucking optimization Reply with quote

"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





PostPosted: Fri Sep 17, 2004 7:12 am    Post subject: Re: Fly fucking optimization Reply with quote

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





PostPosted: Fri Sep 17, 2004 7:14 am    Post subject: Re: Fly fucking optimization Reply with quote

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





PostPosted: Fri Sep 17, 2004 7:17 am    Post subject: Re: Fly fucking optimization Reply with quote

[email]kanze (AT) gabi-soft (DOT) fr[/email] writes:

Quote:
Ceci dit, la solution classique serait plutôt :

i &= ~1 ;

Euh, il veut que i soit impair et au plus egal a la valeur precedante.
Tu le rends pair.

A+
--
Jean-Marc
FAQ de fclc++: http://www.cmla.ens-cachan.fr/~dosreis/C++/FAQ
C++ FAQ Lite en VF: http://www.ifrance.com/jlecomte/c++/c++-faq-lite/index.html
Site de usenet-fr: http://www.usenet-fr.news.eu.org

Back to top
Alexandre Bacquart
Guest





PostPosted: Fri Sep 17, 2004 7:19 am    Post subject: Re: Fly fucking optimization Reply with quote

[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





PostPosted: Fri Sep 17, 2004 7:24 am    Post subject: Re: Fly fucking optimization Reply with quote

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
Display posts from previous:   
Post new topic   Reply to topic    C++Talk.NET Forum Index -> C++ (French) All times are GMT
Goto page 1, 2, 3  Next
Page 1 of 3

 
Jump to:  
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


Powered by phpBB © 2001, 2006 phpBB Group
SEO toolkit © 2004-2006 webmedic.