OVH Cloud OVH Cloud

vitesse: if vs pointeur de methode

126 réponses
Avatar
Guillaume Desticourt
bonsoir,

je m interroge sur la vitesse d execution entre une comparaison et un
pointeur de methode.
j ai une class dont une methode peut changer de comportement au cours de
la vie du process, mais cela rarement.
je me demandais si je devais avoir une methode unique avec un bloc
if/else ou alors un pointeur de methode sette a la methode qui va bien.
j ai donc ecrit deux petits programmes de test, et la solution if/else
est /visiblement/ plus rapide.
et donc je me demandais:
- est ce que mon test est pertinent?
- pourquoi une telle difference de temps?

les prog ont ete compile sous un linux 2.6 avec g++ 3.3.5

merci,

def.hh
------


#ifndef DEF_HH
# define DEF_HH

#include <stdlib.h>

#define MAX_LOOP 1000000000

class Test;

typedef int (Test::*behavior_t)(void);

class Test
{
public:
Test() :
_test(true)
{
}

int behavior1(void)
{
return 0;
}
int behavior2()
{
return 0;
}

inline bool isTrue(void)
{
return _test;
}
private:
bool _test;
};

#endif

if.cc
-----


#include "def.hh"

int main(void)
{
Test * test = new Test();

for (unsigned long u = 0;
u < MAX_LOOP;
++u)
{
if (test->isTrue())
test->behavior1();
else
abort();
}
return 0;
}


pointer.cc
----------



#include "def.hh"

int main(void)
{
Test * test = new Test();
behavior_t behavior;
if (test->isTrue())
behavior = &Test::behavior1;
else
abort();

(test->*behavior)();


for (unsigned long u = 0;
u < MAX_LOOP;
++u)
{
(test->*behavior)();
}
return 0;
}


Makefile
--------

all: iftest pointertest

iftest: def.hh
g++ -Wall -Werror -O2 if.cc -o iftest

pointertest: def.hh
g++ -Wall -Werror -O2 pointer.cc -o pointertest

clean:
rm -f *.o
rm -f *~
rm -f iftest pointertest


une tarball est - provisoirement - disponible ici:
http://www.freenopen.net/~guillaume/info/prog/source/ifpointerbench-20050720-1755.tar.bz2

--
Guillaume Desticourt

10 réponses

Avatar
Gabriel Dos Reis
"Michel Michaud" writes:

| Dans le message ,
| > "Michel Michaud" writes:
| >> Si tu crois que ISO-C++ peut faire tout ce que fait C#, alors tu
| >
| > Quel est le rapport ? Certainement, C# ne peut pas faire tout ce que
| > fait C++. Que peut-on en conclure ?
|
| Rien, je n'ai jamais dit que C# remplacerait C++ où que ce soit.
|
| Par contre, tu as affirmé que C++ était recommandé pour remplacer
| C# chez MS.

Peux-tu donner les références de cette affirmation ?

| >> n'avais probablement pas les connaissances pour comprendre ce qu'il
| >> t'a dit.
| >
| > N'est-ce pas ?
|
| C'est vrai ? Je croyais pourtant le contraire...

Ah bon ?

| >> Mais je doute que ce soit le cas, alors je ne comprends
| >> pas et j'ouvre une porte : Microsoft va changer .NET pour qu'on
| >> puisse en faire avec ISO-C++ ? Superbe nouvelle ! Donne le nom de
| >> ta taupe, on va pouvoir en faire une nouvelle officielle...
| >
| > D'abord, vu les échanges, je doute fort que tu aies les moyens de
| > comprendre. Et toc. :-)
|
| Je vois que tu évites surtout de répondre...

Npn, je n'évite pas de répondre. J'essaie juste de t'amener à lire ce
que j'ai écrit et non ce que tu imagines que j'ai écrit.

-- Gaby
Avatar
Fabien LE LEZ
On 21 Jul 2005 17:24:38 +0200, Gabriel Dos Reis
:

En ce qui concerne ta question, je pourrais te dire que MS est une
très *grande* entreprise et donc emploie des gens avec des vues assez
diversifiées :-).


D'autant que C# concerne principalement le service marketing. Les gus
qui font tout à fait autre chose (développement de Office par exemple)
n'ont rien à voir là-dedans.

Avatar
Fabien LE LEZ
On Thu, 21 Jul 2005 09:17:18 -0400, "Michel Michaud" :

si tu as quelques Mo de données, tu
peux les charger entièrement en mémoire, dans tes propres
^^^^^^^^^^^^^^^^^^^


Je vois mal comment on peut s'assurer de ça dans les systèmes
d'exploitation modernes...


J'ai bien dit "en mémoire", pas "en RAM physique".

Du point de vue du programmeur C++, il n'y a pas de différence entre
la RAM physique et la mémoire virtuelle.

Et en pratique, sous Windows au moins, si tu as une petite quantité de
données (mettons, 10 ou 20 Mo), ça n'augmentera pas sensiblement le
phénomène de swapping.


Avatar
Gabriel Dos Reis
"Michel Michaud" writes:

| Dans le message ,
| > "Michel Michaud" writes:
| >
| >> C++/CLI semble avoir trop tardé.
| >
| > Ah bon ?
|
| Oui. Pour beaucoup de monde en tout cas.
|
| Moi je peux enseigner ce que je veux, sans me préoccuper de
| l'industrie (ce n'est pas ce que je fais, mais je pourrais).
| Par contre, regarde ici par exemple :
|
| http://www.technologia.com/fr/accueil/tous.php

Il faut de tout pour faire un monde.

| Eux offrent des cours et donnent ceux qui sont demandés. C'est
| la raison d'être de la compagnie. Ils n'ont pas de préjugés.
| Regarde le nombre de cours de C++... (il n'y en a aucun)

Et la conclusion est ?

| Il n'y a pas si longtemps, il s'en donnait plusieurs différents,
| plusieurs fois par année. Puis l'offre a continué, mais pas la
| demande semble-t-il : il n'y avait plus assez d'inscriptions pour
| donner les cours. Depuis peu, il n'y a même plus d'offres de
| cours en C++...
|
| Évidemment, je ne peux que parler pour ma région du monde...

J'allais le suggérer.

-- Gaby
Avatar
Laurent Deniau
Guillaume Desticourt wrote:
bonsoir,

je m interroge sur la vitesse d execution entre une comparaison et un
pointeur de methode.


Juste pour info, l'implementation fait probablement elle-meme un test
sur le pointeur pour savoir s'il sagit d'un pointeur de fonction membre
ou de methode.

a+, ld.

Avatar
Fabien LE LEZ
On Thu, 21 Jul 2005 13:45:35 -0400, "Michel Michaud" :

C++/CLI semble avoir trop tardé.



Oui. Pour beaucoup de monde en tout cas.


Je n'ai jamais compris pourquoi, dès qu'une nouvelle technologie
pointe le bout de son nez, tout le monde s'engouffre dedans avant même
que la peinture soit sèche.

.Net est une technologie qui vient d'arriver, et n'est manifestement
pas aboutie. Depuis qu'elle existe, j'entends dire "Dans quelques mois
sortira le machin qui va régler vos problèmes." -- en ce moment, c'est
C++/CLI.

Enfin bon, faut bien des volontaires pour essuyer les plâtres,
histoire que tout soit au point quand je m'y mettrai ;-p



Avatar
Gabriel Dos Reis
Fabien LE LEZ writes:

| On Thu, 21 Jul 2005 13:45:35 -0400, "Michel Michaud" :
|
| >>> C++/CLI semble avoir trop tardé.
|
| >Oui. Pour beaucoup de monde en tout cas.
|
| Je n'ai jamais compris pourquoi, dès qu'une nouvelle technologie
| pointe le bout de son nez, tout le monde s'engouffre dedans avant même
| que la peinture soit sèche.

N'est-ce pas là même la définition de « nouvelle technologie » ?

| .Net est une technologie qui vient d'arriver, et n'est manifestement
| pas aboutie. Depuis qu'elle existe, j'entends dire "Dans quelques mois
| sortira le machin qui va régler vos problèmes." -- en ce moment, c'est
| C++/CLI.

Hier, c'était Java.

-- Gaby
Avatar
Michel Michaud
Dans le message ,

Peux-tu donner les références de cette affirmation ?
[...]

Npn, je n'évite pas de répondre.


Mais si. Tu pouvais simplement dire oui ou non, même si tu
voulais ceci :

J'essaie juste de t'amener à lire
ce que j'ai écrit et non ce que tu imagines que j'ai écrit.


C'est reparti. Quand tu ne comprends pas ce que j'écris, c'est
ma faute. Quand je ne comprends pas ce que tu as écrit, c'est de
ma faute aussi. :-(

Ce qui est bien, au moins, c'est qu'il semble que je réfutais
quelque chose que tu n'as pas vraiment dit. C'est parfait comme
ça alors...

--
Michel Michaud
http://www.gdzid.com
FAQ de fr.comp.lang.c++ :
http://www.cmla.ens-cachan.fr/~dosreis/C++/FAQ/

Avatar
Michel Michaud
Dans le message ,
On Thu, 21 Jul 2005 09:17:18 -0400, "Michel Michaud" :

si tu as quelques Mo de données, tu
peux les charger entièrement en mémoire, dans tes propres
^^^^^^^^^^^^^^^^^^^


Je vois mal comment on peut s'assurer de ça dans les systèmes
d'exploitation modernes...


J'ai bien dit "en mémoire", pas "en RAM physique".


Admettons... (mais tu devrais utiliser un vocabulaire plus précis,
parce que je ne crois pas qu'on comprenne habituellement mémoire
comme « RAM plus espace dans le fichier d'échange potentiel... »,
tiens j'ai plus de 40 Go dans ma machine ?)

Du point de vue du programmeur C++, il n'y a pas de différence entre
la RAM physique et la mémoire virtuelle.


Mais si, au point de vue performance et c'est justement ce dont on
parlait il me semble... (on peut perdre bien des avantages de vitesse
de C++ si on se met à charger trop de données en « mémoire »...)

Et en pratique, sous Windows au moins, si tu as une petite quantité
de données (mettons, 10 ou 20 Mo), ça n'augmentera pas sensiblement
le phénomène de swapping.


Tu ne peux pas le savoir. Ça dépend de bien d'autres facteurs que
ton programme seul. Même si on contourne habituellement l'anomalie
de Belady par des algorithmes appropriés, on continue à en parler
justement pour se rappeler que les surprises sont toujours possibles
et qu'on peut difficilement prévoir l'imprévisible :-)

--
Michel Michaud
http://www.gdzid.com
FAQ de fr.comp.lang.c++ :
http://www.cmla.ens-cachan.fr/~dosreis/C++/FAQ/



Avatar
Michel Michaud
Dans le message ,
On Thu, 21 Jul 2005 13:45:35 -0400, "Michel Michaud" :

C++/CLI semble avoir trop tardé.



Oui. Pour beaucoup de monde en tout cas.


Je n'ai jamais compris pourquoi, dès qu'une nouvelle technologie
pointe le bout de son nez, tout le monde s'engouffre dedans avant
même que la peinture soit sèche.


Seulement parce que et quand elle répond à des besoins ?

.Net est une technologie qui vient d'arriver, et n'est manifestement
pas aboutie.


Tu veux dire qu'elle continuera à s'améliorer ? Comme tout le reste
j'imagine, sans aucun doute...

Depuis qu'elle existe, j'entends dire "Dans quelques
mois sortira le machin qui va régler vos problèmes."


Ah, je n'ai pas entendu ça... J'ai surtout vu plein de gens
l'utiliser...

-- en ce moment, c'est C++/CLI.


Ah mais non. Ça ce n'est pas un problème .NET qui sera résolu,
c'est au mieux un problème C++ ! Son absence (et même Managed C++)
n'a pas empêché les développements en .NET...

Enfin bon, faut bien des volontaires pour essuyer les plâtres,
histoire que tout soit au point quand je m'y mettrai ;-p


Tu vas attendre combien de temps avant de faire du C++, d'utiliser
Windows ou Linux ? :-)

(j'imagine que Java est out aussi...)

--
Michel Michaud
http://www.gdzid.com
FAQ de fr.comp.lang.c++ :
http://www.cmla.ens-cachan.fr/~dosreis/C++/FAQ/