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
Michel Michaud
Dans le message ,
On Thu, 21 Jul 2005 09:23:43 -0400, "Michel Michaud" :

Plus sérieusement : s'il y a une meilleure alternative, ce sont
les développeurs qui vont laisser tomber C# avant MS.


Pas sûr. MS a décidé d'abandonner d'abandonner Visual Basic,


Ah oui ? J'aimerais bien voir où tu as vu ça (ma femme encore plus,
car elle travaille en VB !).

les MFC, etc.


Ah oui ? Ce n'est pourtant pas ce qui est annoncé...

C++/CLI semble avoir trop tardé. Mes sources m'indiquent qu'il
se fait beaucoup de développement .NET en VB et que C# semble
le chemin le plus couramment considéré par ceux qui ne veulent
pas faire du « BASIC »... Mais quand C++/CLI sera officiellement
là, je crois que ça pourrait changer (je l'espère :-).

--
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 ,
"Michel Michaud" writes:
J'étais peut-être un peu trop subtil avec
mon mot standard entre guillemets :-(


Peut-être.

C'est sûr qu'un standard officiel est un standard officiel, mais
je prenais le mot standard dans son sens général de courant,
habituel, etc¹. Ceux qui vont faire du C++/CLI ne pourront faire
que ça (tout ce qu'ils auront besoin sera là), alors que ceux qui
font du C++ ne peuvent le plus souvent ni s'y limiter (il faut
des bibliothèques ou des garanties supplémentaires), ni l'utiliser
complètement (par manque de conformité des compilateurs courants).


Je comprends encore moins pourquoi cela fait de C++/CLI quelque
chose de plus « standard » que C++.


Alors oublie le mot standard. C'était un jeu de mots, comme je
l'ai dit, je le prenais au sens normal de « courant »...

D'ailleurs, je n'ai pas dit « fait », j'ai dit « fera » (ou plutôt
« vont faire ». Ceux qui feront du C++/CLI feront du vrai C++/CLI,
ce sera la chose normale, courante, standard quoi (oups !). Pour le
moment personne ne peut vraiment faire du C++/CLI...

--
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 ,
"Michel Michaud" writes:

Dans le message ,
C'est intéressant, parce que selon des sources sûres, MS encourage
les dévelopements internes en C++, et non plus en C# comme cela a
été la politique juste après le lancement de la propagande C#.


Tu te trompes.



Je remets la phrase complète, au cas où... J'avais bien dit :

Tu te trompes. C'est C++/CLI qui est encouragé au lieu de C#. Et
C++/CLI != C++.


Tu veux dire ma taupe au sein de MS m'aurait menti ? J'ai du mal à
te croire, sans vouloir t'offenser :-)


Si tu crois que ISO-C++ peut faire tout ce que fait C#, alors tu
n'avais probablement pas les connaissances pour comprendre ce qu'il
t'a dit. 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...

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



Avatar
Arnaud Meurgues
Guillaume Desticourt wrote:

bon ca revient au meme que mon pointer de methode si ce n est que au
lieu de bosser avec des objets Stratetegy ma solution de pointer de
methode bosser avec des methodes behavior, et que le behavior est donc
dans ma classe principale au lieu d etre dans une derivee de Strategy.
bref il me semble que c est pareil?


Sauf que le pattern Strategy, faisant partie des design pattern, est
aisément identifiable par un relecteur. Alors que les pointeurs de
méthode behavior demandera plus d'explications pour être correctement
compris par un relecteur.

De plus, il est plus facile d'étendre à plus de deux comportements le
pattern strategy que celui avec les pointeurs de fonction qui nécessite
de modifier la classe d'appel.

Arnaud

Avatar
Loïc Joly
Guillaume Desticourt wrote:

bon ca revient au meme que mon pointer de methode si ce n est que au
lieu de bosser avec des objets Stratetegy ma solution de pointer de
methode bosser avec des methodes behavior, et que le behavior est donc
dans ma classe principale au lieu d etre dans une derivee de Strategy.
bref il me semble que c est pareil?



Sauf que le pattern Strategy, faisant partie des design pattern, est
aisément identifiable par un relecteur. Alors que les pointeurs de
méthode behavior demandera plus d'explications pour être correctement
compris par un relecteur.

De plus, il est plus facile d'étendre à plus de deux comportements le
pattern strategy que celui avec les pointeurs de fonction qui nécessite
de modifier la classe d'appel.


D'autres avantages de Strategy :

- On peut facilement donner un état à une stratégie,
- Si une stratégie s'exprime en deux partie, la cohérence est plus forte
(on ne risque pas de mélanger un Pointeur_de_fonction_1_version_A avec
un Pointeur_de_fonction_1_version_B)


--
Loïc


Avatar
Gabriel Dos Reis
"Michel Michaud" writes:

| D'ailleurs, je n'ai pas dit « fait », j'ai dit « fera »

Cela était bien compris.

-- Gaby
Avatar
Gabriel Dos Reis
"Michel Michaud" writes:

| Dans le message ,
| > "Michel Michaud" writes:
| >
| >> Dans le message ,
| >>> C'est intéressant, parce que selon des sources sûres, MS encourage
| >>> les dévelopements internes en C++, et non plus en C# comme cela a
| >>> été la politique juste après le lancement de la propagande C#.
| >>
| >> Tu te trompes.
|
| Je remets la phrase complète, au cas où... J'avais bien dit :
|
| >> Tu te trompes. C'est C++/CLI qui est encouragé au lieu de C#. Et
| >> C++/CLI != C++.
|
| > Tu veux dire ma taupe au sein de MS m'aurait menti ? J'ai du mal à
| > te croire, sans vouloir t'offenser :-)
|
| 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 ?

| n'avais probablement pas les connaissances pour comprendre ce qu'il
| t'a dit.

N'est-ce pas ?

| 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. :-)
Et si k ete donnais son nom, ce n'est plus une taipe, n'est-ce pas ?

-- Gaby
Avatar
Gabriel Dos Reis
"Michel Michaud" writes:

| C++/CLI semble avoir trop tardé.

Ah bon ?

-- Gaby
Avatar
Michel Michaud
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.

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...

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... Oublie la taupe : tu
confirmes que MS va changer .NET pour rendre possible de l'utiliser
avec ISO-C++ ?

--
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 ,
"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

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)

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...

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