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

9 10 11 12 13
Avatar
Gabriel Dos Reis
Laurent Deniau writes:

| Dans les langages fonctionnels, tu as les fermetures qui permettent
| "d'enfermer" les effets de bords dans un contexte ferme et
| persistant. Si dans de tels langages tu trouves des effets de bords,
| c'est probablement parce qu'on le veut bien pour des raisons x ou y
| (simplicite, efficacite, etc...).

ou simplement parce que c'est necessaire pour des raisons basiques :-)

-- Gaby
Avatar
Jean-Marc Bourguet
Gabriel Dos Reis writes:

Jean-Marc Bourguet writes:

| Haskell n'a pas d'effet de bord, mais un concept (les
| monades) qui permet d'en avoir le goût et la saveur.
| Mais je n'ai jamais réellement pris la peine de
| comprendre ce que c'était.

Les IO monads, par exemple ? C'est bel et bien des effets
de bord. La seule difference avec des langages
profondement imperatifs, c'est qu'ils ont une construction
typee pour marquee la ou se trouve les effets de
bords. sinon, ils ont bien des effets de bords et meme des
constructions "unsafe". Ils disent "purement fonctionnel",
mais ils fournissent aussi la definition qui va avec :-)


Je me demandais s'il y avait quelque chose qui m'échappait;
mais j'avais apparemment donc bien compris :-)

A+

--
Jean-Marc
FAQ de fclc++: http://www.cmla.ens-cachan.fr/~dosreis/C++/FAQ
C++ FAQ Lite en VF: http://www.ifrance.com/jlecomte/c++/c++-faq-lite/index.html
Site de usenet-fr: http://www.usenet-fr.news.eu.org

Avatar
Matthieu Moy
Jean-Marc Bourguet writes:

Je me demandais s'il y avait quelque chose qui m'échappait;
mais j'avais apparemment donc bien compris :-)


A partir du moment ou tu fais des IO, de toutes façons, on se demande
ce que ça peut vouloir dire du purement fonctionnel ...

--
Matthieu

Avatar
Gabriel Dos Reis
Matthieu Moy writes:

| Jean-Marc Bourguet writes:
|
| > Je me demandais s'il y avait quelque chose qui m'échappait;
| > mais j'avais apparemment donc bien compris :-)
|
| A partir du moment ou tu fais des IO, de toutes façons, on se demande
| ce que ça peut vouloir dire du purement fonctionnel ...

Ah mais, j'ai deux livres ici sur mon bureau qui expliquent cela tres
tres bien -- en plus en "grec" ;-)

-- Gaby
Avatar
kanze
Michel Michaud wrote:
Dans le message ,
En passant, je me démande ce qui s'est passé avec ce bon
vieux mot « sous-programme » (« subroutine » en anglais).
C'est le mot que j'utilisais bien avant d'entendre parler
des fonctions et des procédures.


Je crois que chaque langage (ou presque) introduit de nouveaux
mots pour montrer les nuances.


C'est à peu près ce que je croyais. Au fond, la différence entre
les fonctions de C++ et les méthodes de Java, c'est du
marketing, et rien d'autre. D'ailleurs, on pourrait dire la même
chose, je crois, en parlant des fonctions de Lisp et des
méthodes de Smalltalk.

En fait, c'est de là, je crois, que vient les distinctions dans
des vocabulaires du C++ et du Java. Parce qu'en Smalltalk, on
parlait de méthodes, c'est OO, c'est cool. Tandis que même
Fortran avait des fonctions. C'est de la merde, donc. N'empêche
que si quelqu'un réussi à trouver une différence réele entre les
fonctions statiques de Java et les fonctions de Fortran (sans
parler du C ou du C++), j'aimerais la connaître.

En principe, il me semble (en tout cas, c'est ce que j'ai
appris il y a plus de 25 ans !) que l'idée générale de
découpage s'appelait « modularité ». L'idée des
sous-programmes (je crois que l'on peut dire que c'est un
autre mot assez général) n'est déjà qu'une des formes
possibles de la modularité.


Certes. Mais on parle ici que de cette forme.

Si l'on regarde les possibilités des premiers langages
courants, il y avait tellement de différences de principes
dans leurs applications de la modularité que ce n'était
peut-être pas une mauvaise idée d'avoir des mots différents...
(des paragraphes de COBOL aux fonctions membres de C++, il y a
un gros pas !)


En ce qui concerne les paragraphes de COBOL, je te concède qu'il
y a une différence importante ; je ne vois effectivement pas
d'équivalent en C ou en C++ à quelque chose comme :
PERFORM A THRU C VARYING I FROM 1 TO 10.

Question : est-ce qu'une fonction, au sens mathématique,
peut avoir des effets de bord ? Et en admettant que oui,
est-ce qu'on peut réelement appeler quelque chose une
fonction


Si l'inventeur du langage appelle ça une fonction, alors oui,
on peut :-)


C'est pour ça que j'ai démandé « au sens mathématique ». Ça
m'est clair que c'est une question de définition, et que les
concepteurs du langage s'amuse aussi à créer le langage (voire
une langue) pour parler de leur langage.

Il n'y a qu'à penser à l'appellation « méthode statique » pour
voir qu'on n'en est plus à une absurdité près !


Je dirais que déjà avec l'appellation « méthode », on est arriv é
à l'absurdité.

D'une certaine manière, une « fonction void » est aussi une
absurdité. Mais ayant vecu l'histoire qui y a amené, elle ne me
choque pas.

Mais j'avoue que le seul mot qui me convient vraiment, c'est
« sous-programme ». Est-ce du à mon âge ?

--
James Kanze GABI Software
Conseils en informatique orientée objet/
Beratung in objektorientierter Datenverarbeitung
9 place Sémard, 78210 St.-Cyr-l'École, France, +33 (0)1 30 23 00 34


Avatar
Bertrand Motuelle
wrote:
Fabien LE LEZ wrote:
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.


Au moins qu'on lui impose C# d'en haut. Ou simplement que MS se
désintéresse de C++ au point à laisser moribonder le compilateur
(comme fait Sun) ;


Qu'est-ce qui te fais penser que Sun laisse leur compilo C++ mourir ?
Récemment, le dit compilo a fait des progrès considérables dans la
gestion des templates, des fonctions inline, etc. Sun permet également
l'utilisation d'une bibliothèque standard bien plus performante et
complète que celle apparue avec C++ 5.0 (d'origine Roguewave) :
STLport. Et un des objectifs affichés est que C++ 5.7 puisse compiler
boost. Le compilateur évolue rapidement dans ce sens, et Sun contribue
à la mise au point des fichiers de configuration de boost.
cf. les messages de Steve Clamage sur le forum du compilo:
http://forum.sun.com/thread.jspa?threadID#793&tstart=0

A+,
Bertrand.


Avatar
Arnaud Meurgues
wrote:

Mais j'avoue que le seul mot qui me convient vraiment, c'est
« sous-programme ». Est-ce du à mon âge ?


Curieusement, moi, je trouve que « procédure » est plus clair que «
sous-programme ».

Comme pour moi, un programme, c'est plutôt une application, un «
sous-programme » m'évoquerait plus un thread ou un process qu'une
fonction ou une procédure.

--
Arnaud

Avatar
Fabien LE LEZ
On 26 Jul 2005 01:14:38 -0700, :

Mais j'avoue que le seul mot qui me convient vraiment, c'est
« sous-programme ». Est-ce du à mon âge ?


Peut-être. J'appartiens à une génération où "sous-programme" signifie
"BASIC" -- je n'ai pas connu d'autre langage qui parle de
sous-programme.

Avatar
Arnaud Meurgues
Fabien LE LEZ wrote:

Peut-être. J'appartiens à une génération où "sous-programme" signifie
"BASIC" -- je n'ai pas connu d'autre langage qui parle de
sous-programme.


L'assembleur, peut-être.

Je me souviens qu'il fut un temps où l'on parlait aussi de routine et de
subroutine...

--
Arnaud

Avatar
Jean-Marc Bourguet
writes:

Mais j'avoue que le seul mot qui me convient vraiment, c'est
« sous-programme ». Est-ce du à mon âge ?


C'est le terme que je préfère (avec en proche second
sous-routine) pour une utilisation générique. Peut-être à
cause d'Ada et de Pascal où fonction et procédure sont
utilisés pour indiquer la présence ou non d'un résultat (et
en Ada une fonction ne peut pas prendre des paramètres out
ou inout). Mais bon j'ai fait aussi de l'algol où une PROC
peut retourner quelque chose.

A+

--
Jean-Marc
FAQ de fclc++: http://www.cmla.ens-cachan.fr/~dosreis/C++/FAQ
C++ FAQ Lite en VF: http://www.ifrance.com/jlecomte/c++/c++-faq-lite/index.html
Site de usenet-fr: http://www.usenet-fr.news.eu.org

9 10 11 12 13