C++Talk.NET Forum Index C++Talk.NET
C++ language newsgroups
 
Archives   FAQFAQ   SearchSearch   MemberlistMemberlist   UsergroupsUsergroups   RegisterRegister 
 ProfileProfile   Log in to check your private messagesLog in to check your private messages   Log inLog in 

vitesse: if vs pointeur de methode
Goto page 1, 2, 3 ... 9, 10, 11  Next
 
Post new topic   Reply to topic    C++Talk.NET Forum Index -> C++ (French)
View previous topic :: View next topic  
Author Message
Guillaume Desticourt
Guest





PostPosted: Wed Jul 20, 2005 4:30 pm    Post subject: vitesse: if vs pointeur de methode Reply with quote




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

Back to top
Fabien LE LEZ
Guest





PostPosted: Wed Jul 20, 2005 4:51 pm    Post subject: Re: vitesse: if vs pointeur de methode Reply with quote



On Wed, 20 Jul 2005 18:30:57 +0200, Guillaume Desticourt
<guillaume.desticourt.invalid (AT) free (DOT) fr>:

Quote:
- est ce que mon test est pertinent?

Est-ce que la différence sera réellement visible par l'utilisateur,
dans le programme final ?

Code de la manière la plus claire et lisible possible, et occupe-toi
des problèmes de performances si le programme final est effectivement
trop lent.


Back to top
Stan
Guest





PostPosted: Wed Jul 20, 2005 5:49 pm    Post subject: Re: vitesse: if vs pointeur de methode Reply with quote




"Fabien LE LEZ" <gramster (AT) gramster (DOT) com> a écrit dans le message de news:
[email]j60td1lpolm6rngbhkv67rsqju52ar0g0l (AT) 4ax (DOT) com[/email]...
Quote:
On Wed, 20 Jul 2005 18:30:57 +0200, Guillaume Desticourt
[email]guillaume.desticourt.invalid (AT) free (DOT) fr[/email]>:

- est ce que mon test est pertinent?

Est-ce que la différence sera réellement visible par l'utilisateur,
dans le programme final ?

Code de la manière la plus claire et lisible possible, et occupe-toi
des problèmes de performances si le programme final est effectivement
trop lent.


Ben oui, c'est pénible un clic de souris qui a une delai de latence
de 2 uS ;-)

--
-Stan



Back to top
Guillaume Desticourt
Guest





PostPosted: Wed Jul 20, 2005 6:25 pm    Post subject: Re: vitesse: if vs pointeur de methode Reply with quote

Fabien LE LEZ a écrit :
Quote:
On Wed, 20 Jul 2005 18:30:57 +0200, Guillaume Desticourt
[email]guillaume.desticourt.invalid (AT) free (DOT) fr[/email]>:


- est ce que mon test est pertinent?


Est-ce que la différence sera réellement visible par l'utilisateur,
dans le programme final ?


je ne sais pas. la en faisant un boucle de 1000000000 iterations, la
difference est visible a l oeil nu. maintenant je n ai aucune idee du
volume de donnees que mon programme aura a traiter. mais la difference
de temps d executions des deux programmes de test est tellement enorme
que je me dis qu'il doit y avoir une erreur.

Quote:
Code de la manière la plus claire et lisible possible, et occupe-toi
des problèmes de performances si le programme final est effectivement
trop lent.


heu bof, je trouve plus logique de viser le resultat desire plutot
qu'appliquer des rustines et me retrouver avec un code - encore plus -
illisible. Surtout que ca se fera a coup sur beaucoup plus tard, et tout
aussi surement par quelqu'un d'autre qui ne comprendra pas mon code...

Enfin la on est limite HS vis a vis du c++ et du probleme - technique -
qui etait: pourquoi un test est plus lent qu un passage par pointeur de
fonction?

cordialement,

--
Guillaume Desticourt

Back to top
Richard Delorme
Guest





PostPosted: Wed Jul 20, 2005 6:32 pm    Post subject: Re: vitesse: if vs pointeur de methode Reply with quote

Fabien LE LEZ a écrit :
Quote:
On Wed, 20 Jul 2005 18:30:57 +0200, Guillaume Desticourt
[email]guillaume.desticourt.invalid (AT) free (DOT) fr[/email]>:


- est ce que mon test est pertinent?


Est-ce que la différence sera réellement visible par l'utilisateur,
dans le programme final ?

Code de la manière la plus claire et lisible possible, et occupe-toi
des problèmes de performances si le programme final est effectivement
trop lent.

Si les performances ne sont pas importantes, pourquoi diable programmer
en C++ ?

--
Richard

Back to top
Richard Delorme
Guest





PostPosted: Wed Jul 20, 2005 6:59 pm    Post subject: Re: vitesse: if vs pointeur de methode Reply with quote

Guillaume Desticourt a écrit :
Quote:
bonsoir,

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

La question est donc de savoir si ça :

Quote:
{
if (test->isTrue())
test->behavior1();
else
abort();
}

est plus lent que :

Quote:
{
(test->*behavior)();
}

Ça me semble un peu évident non ?
Appeler une fonction (vide en plus) à travers un pointeur de fonction,
ou par la fonction elle même produit à peu près les mêmes performances.
Ajouter un autre appel de fonction (test->isTrue()) et un test
(if(...)) supplémentaire va donc logiquement réduire les performances.
Pour peu que le compilateur soit intelligent et ait supprimé l'appel à
une fonction vide, le test de performance compare une boucle vide, avec
une boucle contenant des choses...

Il n'y a que la fable qui voit la tortue devancer le lièvre.


--
Richard

Back to top
Guillaume Desticourt
Guest





PostPosted: Wed Jul 20, 2005 7:39 pm    Post subject: Re: vitesse: if vs pointeur de methode Reply with quote

Richard Delorme a écrit :
Quote:
Guillaume Desticourt a écrit :

bonsoir,

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


La question est donc de savoir si ça :

{
if (test->isTrue())
test->behavior1();
else
abort();
}


est plus lent que :

{
(test->*behavior)();
}


Ça me semble un peu évident non ?

oui. a moi aussi, c est pour cela que j'ai poste :)

Quote:
Appeler une fonction (vide en plus) à travers un pointeur de fonction,
ou par la fonction elle même produit à peu près les mêmes performances.
Ajouter un autre appel de fonction (test->isTrue()) et un test
(if(...)) supplémentaire va donc logiquement réduire les performances.
Pour peu que le compilateur soit intelligent et ait supprimé l'appel à
une fonction vide, le test de performance compare une boucle vide, avec
une boucle contenant des choses...

Il n'y a que la fable qui voit la tortue devancer le lièvre.



Justement, a l'execution, la premiere methode (if) est plus rapide que
la deuxieme!!! mais peut etre le compilateur a t il reussi a supprimer
l'appel a la fonction vide mais pas a travers le pointeur de fonction...
je referai le test demain avec une fonction non vide, et peut etre sans
le -O2

cordialement,

--
Guillaume Desticourt

Back to top
Fabien LE LEZ
Guest





PostPosted: Thu Jul 21, 2005 4:41 am    Post subject: Re: vitesse: if vs pointeur de methode Reply with quote

On Wed, 20 Jul 2005 20:32:41 +0200, Richard Delorme
<abulmo (AT) nospam (DOT) fr>:

Quote:
Si les performances ne sont pas importantes

Je n'ai absolument pas dit ça.

Je dis juste que tenter de bidouiller, au détriment de la lisibilité
du code, et au détriment des autres fonctionnalités (le temps qu'on
passe à essayer d'optimiser là où ce n'est pas forcément nécessaire,
on ne le passe pas à implémenter autre chose) est une mauvaise idée.

Le C++ permet déjà une grande rapidité tout en codant élégamment. Si,
à l'exécution, certaines fonctionnalités se révèlent trop lentes,
alors seulement on repère (avec un profiler) les fonctions à
optimiser, et on tente de les optimiser. Mais ça n'arrive pas si
souvent que ça.

Quote:
, pourquoi diable programmer en C++ ?

Le C++ a deux gros avantages :

- c'est un langage très puissant, très riche ;

- l'exécution des programmes est généralement rapide, ce qui
permet souvent de ne pas se préoccuper d'optimisation. Le raisonnement
va assez loin : si tu as quelques Mo de données, tu peux les charger
entièrement en mémoire, dans tes propres structures, plutôt que
d'utiliser un moteur externe de base de données, avec tous les
problèmes de déploiement que ça implique.


Back to top
Richard Delorme
Guest





PostPosted: Thu Jul 21, 2005 4:51 am    Post subject: Re: vitesse: if vs pointeur de methode Reply with quote

Guillaume Desticourt a écrit :

Quote:
Justement, a l'execution, la premiere methode (if) est plus rapide que
la deuxieme!!! mais peut etre le compilateur a t il reussi a supprimer
l'appel a la fonction vide mais pas a travers le pointeur de fonction...

Sans doute. Comme le test->isTrue() est toujours vrai, il l'a sans doute
supprimer aussi.

Quote:
je referai le test demain avec une fonction non vide, et peut etre sans
le -O2

Regarder l'assembleur produit peut aussi aider.


--
Richard

Back to top
Richard Delorme
Guest





PostPosted: Thu Jul 21, 2005 5:36 am    Post subject: Re: vitesse: if vs pointeur de methode Reply with quote

Fabien LE LEZ a écrit :
Quote:
On Wed, 20 Jul 2005 20:32:41 +0200, Richard Delorme
[email]abulmo (AT) nospam (DOT) fr[/email]>:


Si les performances ne sont pas importantes


Je n'ai absolument pas dit ça.

C'est ce que je comprends.

Quote:
Je dis juste que tenter de bidouiller, au détriment de la lisibilité
du code, et au détriment des autres fonctionnalités (le temps qu'on
passe à essayer d'optimiser là où ce n'est pas forcément nécessaire,
on ne le passe pas à implémenter autre chose) est une mauvaise idée.

Un truc de mon expérience personnelle : la plupart des optimisations
rendent le code plus clair. La meilleure façon d'optimiser un code c'est
de supprimer du code inutile, et moins il y a de code, plus c'est clair.
Par exemple, enlever un test toujours vrai (donc inutile) rend le code
plus lisible et plus rapide. Et avec la quantité de code que je vois
passer et qui contient toutes sortes de choses inutiles : variables
redondantes, calculs inutilisés par la suite, etc. il y a de quoi optimiser.

Quote:
Le C++ permet déjà une grande rapidité tout en codant élégamment. Si,
à l'exécution, certaines fonctionnalités se révèlent trop lentes,
alors seulement on repère (avec un profiler) les fonctions à
optimiser, et on tente de les optimiser. Mais ça n'arrive pas si
souvent que ça.

Le souvent dépend du domaine d'application.


Quote:
, pourquoi diable programmer en C++ ?


Le C++ a deux gros avantages :

- c'est un langage très puissant, très riche ;

Je ne trouve pas justement. Des langages comme Java, Python, Ruby, etc
dont beaucoup plus riches et supportent plein de fonctionnalité
nativement (multi-threads, graphismes, réseau, ramasse-miette, etc.) et
à mon avis, on code beaucoup plus élégamment et rapidement avec eux
qu'en C++. Par contre leurs performances sont lamentables...


Quote:
- l'exécution des programmes est généralement rapide, ce qui
permet souvent de ne pas se préoccuper d'optimisation.

Mon raisonnement, est que, comme le C++ produit un code rapide, le
besoin de performances peu justifier sont choix. Et ce critère oblige
aussi à se préoccuper d'optimisation.


Quote:
Le raisonnement
va assez loin : si tu as quelques Mo de données, tu peux les charger
entièrement en mémoire, dans tes propres structures, plutôt que
d'utiliser un moteur externe de base de données, avec tous les
problèmes de déploiement que ça implique.

Ce n'est pas un exemple d'optimisation ça ?

--
Richard

Back to top
Matthieu Moy
Guest





PostPosted: Thu Jul 21, 2005 7:06 am    Post subject: Re: vitesse: if vs pointeur de methode Reply with quote

Guillaume Desticourt <guillaume.desticourt.invalid (AT) free (DOT) fr> writes:

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

Il est là à mon avis, ton problème. Met cette fonction dans un .cpp
inaccessible au compilo quand il compile le bout de code que tu veux
benchmarquer, et met cet appel dans les deux bouts de codes que tu
testes (l'un dans le if(...), l'autre n'importe ou vu que le compilo
ne pourra pas savoir si il y a un effet de bord).

Si tu veux benchmarquer X Vs Y, il faut qu'il n'y ai que X et Y qui
changent ...

--
Matthieu

Back to top
Fabien LE LEZ
Guest





PostPosted: Thu Jul 21, 2005 7:19 am    Post subject: Re: vitesse: if vs pointeur de methode Reply with quote

On Thu, 21 Jul 2005 07:36:10 +0200, Richard Delorme
<abulmo (AT) nospam (DOT) fr>:

Quote:
Un truc de mon expérience personnelle : la plupart des optimisations
rendent le code plus clair. La meilleure façon d'optimiser un code c'est
de supprimer du code inutile, et moins il y a de code, plus c'est clair.

On est loin de cette vision des choses dans le message de départ du
thread (<news:42de7c43$0$21325$626a14ce (AT) news (DOT) free.fr>).

Je te rejoins toutefois sur un point : si tu fais du code clair, sans
chercher à bidouiller, en bref, si on comprend au premier coup d'oeil
ce que tu cherches à faire, il y a des chances pour que le compilateur
(ou le processeur) le comprenne aussi, et optimise d'autant mieux le
code.

Note par ailleurs que pour optimiser, il faut bien souvent bien
connaître le processeur sur lequel on travaille. Du coup, il n'est pas
rare (quand on travaille sur la vidéo par exemple) de trouver, pour le
même OS, plusieurs versions d'un même logiciel : une version Pentium
3, une version Pentium 4, une version "vieux AMD", une version "AMD
avec SSE", etc.


Back to top
kanze@gabi-soft.fr
Guest





PostPosted: Thu Jul 21, 2005 7:21 am    Post subject: Re: vitesse: if vs pointeur de methode Reply with quote

Guillaume Desticourt wrote:

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

Pourquoi ? Ils font des choses différentes. Est-ce que tu as un
problème de performance, et ce sont les deux alternatifs ?

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

La solution classique ici, c'est la modèle stratégie, non ?
Est-ce qu'il y a des raisons pour faire autre chose ? D'après
mon expérience :

-- La syntaxe de l'utilisation des pointeurs deplaît à
beaucoup. Moi, je m'en sers de temps en temps, mais chaque
fois, j'ai dû bien en justifier l'utilisation dans les
révues de code. Il faut donc bien une justification pour les
utiliser.

-- L'utilisation des if/else (dans ce cas-ci) risque de donner
des fonctions trop grandes et trop complexes.

Pourquoi est-ce que la modèle stratégie ne s'applique pas ?

Quote:
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?

Est-ce qu'il modèle réelement ton problème ? (À vue d'oeil, une
fois l'optimisateur a fini, tu as une boucle vide, voire rien de
tout dans le cas de if. Il ne faut pas supposer que les auteurs
du compilateur sont des idiots quand même.)

Quote:
- pourquoi une telle difference de temps?

C'est plus facile au compilateur d'optimiser ton code dans le
cas des if/else. Ce qui ne dit rien pour le cas dans ton code
réel.

En général, les appels sur des pointeurs à fonction membre ne
sont pas ce qu'il y a de plus rapide. Mais ce n'est pas là la
question. Qu'est-ce qu'il est plus clair :

(this->*pmf)() ;

--

if ( c1 ) {
f1() ;
} else {
f2() ;
} // Avec éventuellement plus de cas.

--

switch ( mode ) {
case m1 :
f1() ;
break ;

case m2 :
f2() ;
break ;
} // Avec éventuellement plus de cas.

--

deleguee->f() ;

?

(En passant, en C, j'aurais certainement utilisé le switch.
Pourquoi ne pas en avoir parler aussi ?)

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


Back to top
kanze@gabi-soft.fr
Guest





PostPosted: Thu Jul 21, 2005 7:26 am    Post subject: Re: vitesse: if vs pointeur de methode Reply with quote


Richard Delorme wrote:
Quote:
Fabien LE LEZ a écrit :
On Wed, 20 Jul 2005 18:30:57 +0200, Guillaume Desticourt
[email]guillaume.desticourt.invalid (AT) free (DOT) fr[/email]>:

- est ce que mon test est pertinent?

Est-ce que la différence sera réellement visible par
l'utilisateur, dans le programme final ?

Code de la manière la plus claire et lisible possible, et
occupe-toi des problèmes de performances si le programme
final est effectivement trop lent.

Si les performances ne sont pas importantes, pourquoi diable
programmer en C++ ?

Parce que le boss l'impose:-).

Sérieusement, dans beaucoup de cas, quels sont les alternatifs ?
Pour diverses raisons, Ada n'est pas considéré, et encore moins
d'autres langages de la famille Pascal, comme Modula-3. Et dans
la famille C, C++ est à peu près le seul langage où on peut
écrire du code portable et robuste. Java va bien pour des petits
bricoles, mais c'est extrèmement difficile, sinon impossible, de
créer du code réelement robuste. Et je n'ai pas encore régardé
du côté C# ; puisque je travaille sous Solaris, ce n'est même
pas une option.

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


Back to top
Fabien LE LEZ
Guest





PostPosted: Thu Jul 21, 2005 7:32 am    Post subject: Re: vitesse: if vs pointeur de methode Reply with quote

On 21 Jul 2005 00:26:43 -0700, [email]kanze (AT) gabi-soft (DOT) fr[/email]:

Quote:
Et je n'ai pas encore régardé du côté C#

A priori, C# a un gros inconvénient par rapport à C++ : la pérennité.
Ça m'étonnerait beaucoup que Microsoft ne décide pas, dans quelques
années, que C# c'est dépassé et qu'il faut l'abandonner.


Back to top
Display posts from previous:   
Post new topic   Reply to topic    C++Talk.NET Forum Index -> C++ (French) All times are GMT
Goto page 1, 2, 3 ... 9, 10, 11  Next
Page 1 of 11

 
Jump to:  
You cannot post new topics in this forum
You cannot reply to topics in this forum
You cannot edit your posts in this forum
You cannot delete your posts in this forum
You cannot vote in polls in this forum


Powered by phpBB © 2001, 2006 phpBB Group
SEO toolkit © 2004-2006 webmedic.