BIG_BOSS_001
Messages postés75Date d'inscriptiondimanche 10 octobre 2004StatutMembreDernière intervention30 novembre 2005
-
3 août 2005 à 22:06
xterminhate
Messages postés371Date d'inscriptiondimanche 4 janvier 2004StatutMembreDernière intervention23 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
A voir également:
[Performance] Passage par valeur | Passage vers pointeur
BruNews
Messages postés21040Date d'inscriptionjeudi 23 janvier 2003StatutModérateurDernière intervention21 août 2019 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...
BruNews
Messages postés21040Date d'inscriptionjeudi 23 janvier 2003StatutModérateurDernière intervention21 août 2019 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
xterminhate
Messages postés371Date d'inscriptiondimanche 4 janvier 2004StatutMembreDernière intervention23 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.
xterminhate
Messages postés371Date d'inscriptiondimanche 4 janvier 2004StatutMembreDernière intervention23 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!