[Performance] Passage par valeur | Passage vers pointeur [Résolu]

Messages postés
75
Date d'inscription
dimanche 10 octobre 2004
Statut
Membre
Dernière intervention
30 novembre 2005
- - Dernière réponse : xterminhate
Messages postés
371
Date d'inscription
dimanche 4 janvier 2004
Statut
Membre
Dernière intervention
23 septembre 2009
- 5 août 2005 à 00:57
Bonjour,

Je me pose une petite question sur les performances entre le passage par valeur et par pointeur.
Je sais que le premier reçoit par la pile une copie de la variable alors que l'autre sa fonctionne avec son adresse.
Donc sa veut dire que le second devrai être plus rapide, non ?
Je me suis alors amuser à faire ce code en C :

Passage par pointeur :

#include <time.h>
#include <stdio.h>


void Add(int* a, int b)
{
*a += b;
}


void Sou(int* a, int b)
{
*a -= b;
}


void Mul(int* a, int b, int c)
{
*a = b * c;
}


void Div(int* a, int b)
{
*a /= b;
}


void Car(int *a)
{
int b;
b = *a;
*a = b * b;
}


int main(void)
{
int a = clock();
int b = 1;
int c = 8000;
int e = 1;
int i = 1;
int d;
for (b; b <= 1000000; b++)
{
for (e; e <= 1000000; e++)
{
while (i != 1000000)
{
Add(&c, b);
Sou(&c, b - 4);
Mul(&c, c, b * 2);
Div(&c, b);
Car(&c);
i++;
}
}
}
d = clock() - a;
printf("%d\n", d);
return 0;
}

Passage par valeur :

#include <time.h>
#include <stdio.h>


int Add(int a, int b)
{
return a + b;
}


int Sou(int a, int b)
{
return a - b;
}


int Mul(int a, int b)
{
return a * b;
}


int Div(int a, int b)
{
return a / b;
}


int Car(int a)
{
return a * a;
}


int main(void)
{
int a = clock();
int b = 1;
int c = 8000;
int e = 1;
int i = 1;
int d;
for (b; b <= 1000000; b++)
{
for (e; e <= 1000000; e++)
{
while (i != 1000000)
{
c = Add(c, b);
c = Sou(c, b - 4);
c = Mul(c, b * 2);
c = Div(c, b);
c = Car(c);
i++;
}
}
}
d = clock() - a;
printf("%d\n", d);
return 0;
}

Conclusion le passage par valeur et plus rapide que le passage par pointeur.
Alors dans quel(s) cas le passage par pointeur est il plus rapide que celui par valeur ?

BIG_BOSS
Afficher la suite 

14 réponses

Meilleure réponse
Messages postés
21042
Date d'inscription
jeudi 23 janvier 2003
Statut
Modérateur
Dernière intervention
21 août 2019
16
3
Merci
bein sur que passer l'adresse est moins intéressant que dircet la valeur si c'est pour un simple int, la fonction recevante devra déréférencer l'adresse pour lire la valeur.
On passe l'adresse quand la fonction doit modifier ce qui est à cette adresse ou dans le cas d'une structure, etc...

ciao...
BruNews, MVP VC++

Dire « Merci » 3

Quelques mots de remerciements seront grandement appréciés. Ajouter un commentaire

Codes Sources 137 internautes nous ont dit merci ce mois-ci

Commenter la réponse de BruNews
Messages postés
224
Date d'inscription
mardi 12 août 2003
Statut
Membre
Dernière intervention
18 octobre 2010
0
Merci
En effet. Refais ton test avec une structure genre nombre complexe, tu vera la difference...
Commenter la réponse de bayeto
Messages postés
371
Date d'inscription
dimanche 4 janvier 2004
Statut
Membre
Dernière intervention
23 septembre 2009
0
Merci
Et le passage par référence, c'est pour les clowns ;-)
Commenter la réponse de xterminhate
Messages postés
224
Date d'inscription
mardi 12 août 2003
Statut
Membre
Dernière intervention
18 octobre 2010
0
Merci
En C? connais pas.
Commenter la réponse de bayeto
Messages postés
371
Date d'inscription
dimanche 4 janvier 2004
Statut
Membre
Dernière intervention
23 septembre 2009
0
Merci
En effet, si tu es contraint à faire du C pur, c'est copie. Si tu peux faire un peu de C++, ce n'est plus pareil.
Commenter la réponse de xterminhate
Messages postés
21042
Date d'inscription
jeudi 23 janvier 2003
Statut
Modérateur
Dernière intervention
21 août 2019
16
0
Merci
par référence ou adresse, 2 mots qui désignent la même chose, y a que la syntaxe qui change.

ciao...
BruNews, MVP VC++
Commenter la réponse de BruNews
Messages postés
371
Date d'inscription
dimanche 4 janvier 2004
Statut
Membre
Dernière intervention
23 septembre 2009
0
Merci
Le compilateur C++ n'est-il pas en mesure de réaliser certaine optimisation lorsqu'on utilise correctement le passage par référence ?
Commenter la réponse de xterminhate
Messages postés
21042
Date d'inscription
jeudi 23 janvier 2003
Statut
Modérateur
Dernière intervention
21 août 2019
16
0
Merci
Mais c'est stricto sensu LA MEME CHOSE, c'est toujours un pointeur sur une adresse mémoire, y a pas d'alternative, ou on a la valeur ou on a l'adresse.

en cas d'adresse (ou référence) avec 1 param:
mov edx, [esp+4]
mov eax, [edx] // valeur accédée
il a fallu 2 instructions et donc 2 lectures mémoire pour accéder à la valeur

si valeur passée:
mov eax, [esp+4] // valeur en 1 seule instruction

ciao...
BruNews, MVP VC++
Commenter la réponse de BruNews
Messages postés
371
Date d'inscription
dimanche 4 janvier 2004
Statut
Membre
Dernière intervention
23 septembre 2009
0
Merci
Ok pour l'asm, ca parait logique. Cela dit, le passage par pointeur est exceptionnel en C++. On prefera le passage par reference, voire reference-const.
Commenter la réponse de xterminhate
Messages postés
75
Date d'inscription
dimanche 10 octobre 2004
Statut
Membre
Dernière intervention
30 novembre 2005
0
Merci
Merci,
A BruNews et aux autres de m'avoir éclairé sur ces points.

BIG_BOSS
Commenter la réponse de BIG_BOSS_001
Messages postés
1878
Date d'inscription
jeudi 16 octobre 2003
Statut
Membre
Dernière intervention
16 mars 2011
1
0
Merci
[auteurdetail.aspx?ID=213313 xterminhate] & all>



en C++, le passage par ref est bien



vu que c'est équivalent à un passage par adresse, la polique qu'on a adopté

est la suivante:



si c'est une constante,

passage par référence ex:"(const T&v)"



si c'est une variable modifiée,

passage par pointeur ex "(T*pV)"



ça permet d'être clair dans la fonction



et surtout dans les appels de fonctions:



si on voit



d=f(a,&b,*c)



on sait directement

qu'après cette ligne

seuls d et b peuvent avoir été modifiés.





Qu'en pensez vous



et sauriez vous expliquer la préférence de certain à utiliser des

f2(T&v);



sachant qu'après l'appel, on est sur de rien








___________________________________________________________
Magicalement
Nono
Commenter la réponse de magic_Nono
Messages postés
371
Date d'inscription
dimanche 4 janvier 2004
Statut
Membre
Dernière intervention
23 septembre 2009
0
Merci
Je suis pas tout a fait d'accord au sujet de tes regles :
- Passage par référence et objet non modifié : T const &
- Passage par référence et objet modifié : T &

C'est valable pour les pointeurs : T const * (non modif.) et T * (modif).
On peut mixer pour passer un pointeur par référence : T * const & et T * &.

A mon sens, le passage par pointeur s'utilise pour exploiter par exemple le polymorphisme, etc...ou pour manipuler des pointeurs evidement!

Cordialement,
X.
Commenter la réponse de xterminhate
Messages postés
224
Date d'inscription
mardi 12 août 2003
Statut
Membre
Dernière intervention
18 octobre 2010
0
Merci
C'est pas mal non plus les references pour le polymorphisme.
Commenter la réponse de bayeto
Messages postés
371
Date d'inscription
dimanche 4 janvier 2004
Statut
Membre
Dernière intervention
23 septembre 2009
0
Merci
Ca m'étonne ce que tu dis....
Commenter la réponse de xterminhate