[Performance] Passage par valeur | Passage vers pointeur

Résolu
BIG_BOSS_001 Messages postés 75 Date d'inscription dimanche 10 octobre 2004 Statut Membre Dernière intervention 30 novembre 2005 - 3 août 2005 à 22:06
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

14 réponses

BruNews Messages postés 21041 Date d'inscription jeudi 23 janvier 2003 Statut Modérateur Dernière intervention 21 août 2019 19
3 août 2005 à 22:23
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++
3
bayeto Messages postés 224 Date d'inscription mardi 12 août 2003 Statut Membre Dernière intervention 18 octobre 2010
3 août 2005 à 22:28
En effet. Refais ton test avec une structure genre nombre complexe, tu vera la difference...
0
xterminhate Messages postés 371 Date d'inscription dimanche 4 janvier 2004 Statut Membre Dernière intervention 23 septembre 2009
3 août 2005 à 22:45
Et le passage par référence, c'est pour les clowns ;-)
0
bayeto Messages postés 224 Date d'inscription mardi 12 août 2003 Statut Membre Dernière intervention 18 octobre 2010
3 août 2005 à 22:47
En C? connais pas.
0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
xterminhate Messages postés 371 Date d'inscription dimanche 4 janvier 2004 Statut Membre Dernière intervention 23 septembre 2009
3 août 2005 à 22:51
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.
0
BruNews Messages postés 21041 Date d'inscription jeudi 23 janvier 2003 Statut Modérateur Dernière intervention 21 août 2019 19
3 août 2005 à 22:53
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++
0
xterminhate Messages postés 371 Date d'inscription dimanche 4 janvier 2004 Statut Membre Dernière intervention 23 septembre 2009
3 août 2005 à 22:57
Le compilateur C++ n'est-il pas en mesure de réaliser certaine optimisation lorsqu'on utilise correctement le passage par référence ?
0
BruNews Messages postés 21041 Date d'inscription jeudi 23 janvier 2003 Statut Modérateur Dernière intervention 21 août 2019 19
3 août 2005 à 23:02
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++
0
xterminhate Messages postés 371 Date d'inscription dimanche 4 janvier 2004 Statut Membre Dernière intervention 23 septembre 2009
3 août 2005 à 23:22
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.
0
BIG_BOSS_001 Messages postés 75 Date d'inscription dimanche 10 octobre 2004 Statut Membre Dernière intervention 30 novembre 2005
4 août 2005 à 10:55
Merci,
A BruNews et aux autres de m'avoir éclairé sur ces points.

BIG_BOSS
0
magic_Nono Messages postés 1878 Date d'inscription jeudi 16 octobre 2003 Statut Membre Dernière intervention 16 mars 2011 1
4 août 2005 à 14:26
[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
0
xterminhate Messages postés 371 Date d'inscription dimanche 4 janvier 2004 Statut Membre Dernière intervention 23 septembre 2009
4 août 2005 à 20:49
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.
0
bayeto Messages postés 224 Date d'inscription mardi 12 août 2003 Statut Membre Dernière intervention 18 octobre 2010
4 août 2005 à 21:57
C'est pas mal non plus les references pour le polymorphisme.
0
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
Ca m'étonne ce que tu dis....
0