Performances moins bonnes sous g++ 3.3

Performances moins bonnes sous g++ 3.3 - C++ - Programmation

Marsh Posté le 17-02-2004 à 17:01:29    

Bonjour,
 
J'ai un programme qui donne des performances correctes sous g++-2.95. Quelqu'un saurait-il pourquoi ce même programme donne des performances (temps) nettement moins bonnes sous g++-3.3 ?
STL ou string aurait qqchose à voir la-dedans ?
 
Merci.

Reply

Marsh Posté le 17-02-2004 à 17:01:29   

Reply

Marsh Posté le 17-02-2004 à 17:39:33    

non. des chiffres, des résultats de profiler, etc on veut des infos

Reply

Marsh Posté le 17-02-2004 à 18:03:49    

OK.
 
Un chiffre comparatif mais le resultat est tjs le meme, 2.95 plus rapide que 3.3, quelques soient la taille des données fournies en entree. Exemple: qd ca prend 13sec sous 2.95, ca va mettre 17sec avec 3.3. Y en a d'autre mais c tjs pareil.
 
(Memes options de compilations -O3 -funroll-all-loops -fomit-frame-pointer...)
 
Avec gprof, la comparaison est difficile car les fonctions listées sont pas les mêmes. Certaines fonctions de bases C++ ne semblent pas etre comptabilisees.  
Pour G++3.3 et le meme exemple, il renvoie un temps total de 12.58s, et pour 2.95, ca donne 12.38s. Mais par contre dans le listing gprof pour 2.95, il y a les basic-string qui apparaissent. Elles sont pas dans le listing gprof obtenu avec 3.3.
 
Avec gcov, ca donne la meme chose pour les deux versions, ce qui est logique, mais bon je donne l'info quand même.
 
kess kil fo comme chiffres, je peux pas tout mettre... c un peu long...
 
Je mets ici les premierres lignes de chaque listing obtenu. D'abord avec g++ 2.95, puis avec g++ 3.3.
 
time   seconds   seconds    calls   s/call   s/call  name    
 35.29      4.44     4.44        1     4.44    12.55  Etape(int, bool **)
 18.60      6.78     2.34 14499822     0.00     0.00  basic_string<char, string_char_traits<char>, __default_alloc_template<true, 0> >::replace(unsigned int, unsigned int, char const *, unsigned int)
 10.73      8.13     1.35 22536057     0.00     0.00  fusionneBitTabStatic(unsigned char **, unsigned char *)
  7.47      9.07     0.94 14499786     0.00     0.00  basic_string<char, string_char_traits<char>, __default_alloc_template<true, 0> >::replace(unsigned int, unsigned int, basic_string<char, string_char_traits<char>, __default_alloc_template<true, 0> > const &, unsigned int, unsigned int)
  5.41      9.75     0.68 22533640     0.00     0.00  fusionneBitTab(unsigned char **, unsigned char *)
  4.69     10.34     0.59  1513696     0.00     0.00  _List_base<Occurrence, allocator<Occurrence> >::clear(void)
  3.42     10.77     0.43 12825272     0.00     0.00  Node::getLabelEnd(void)
  2.94     11.14     0.37 12731122     0.00     0.00  Node::getLabelLength(void)
  2.54     11.46     0.32 20911004     0.00     0.00  Profil::E(void)
  2.38     11.76     0.30 22536057     0.00     0.00  Node::getSequences(void)
  2.38     12.06     0.30 14572592     0.00     0.00  Node::getLabelBeginning(void)
  1.67     12.27     0.21 14537633     0.00     0.00  Data::The_One_Sequence(void)
  1.11     12.41     0.14  5658558     0.00     0.00  Node::getChild(int)
  0.95     12.53     0.12   380842     0.00     0.00  nbSequenceInBitTabStatic(unsigned char *)
  0.24     12.56     0.03   378424     0.00     0.00  ReinitBitTab(unsigned char **)
  0.08     12.57     0.01     8015     0.00     0.00  extension(int, int, Node *, int *, int *)
  0.08     12.58     0.01        1     0.01     0.02  elagage_all(Node *, int *, int, bool)
  0.00     12.58     0.00   378424     0.00     0.00  Profil::Q(void)
  0.00     12.58     0.00    98621     0.00     0.00  Profil::K(void)
  0.00     12.58     0.00    86196     0.00     0.00  Profil::N(void)
 
 
****3.3****
 time   seconds   seconds    calls   s/call   s/call  name    
 40.93      5.19     5.19        1     5.19    12.42  Etape(int, bool**)
 14.51      7.03     1.84 22536057     0.00     0.00  fusionneBitTabStatic(unsigned char**, unsigned char*)
  7.73      8.01     0.98 22533641     0.00     0.00  std::list<Occurrence, std::allocator<Occurrence> >::insert(std::_List_iterator<Occurrence, Occurrence&, Occurrence*>, Occurrence const& )
  6.78      8.87     0.86 22533641     0.00     0.00  std::list<Occurrence, std::allocator<Occurrence> >::_M_create_node(Occurrence const& )
  4.30      9.42     0.55 22533640     0.00     0.00  fusionneBitTab(unsigned char**, unsigned char*)
  3.86      9.91     0.49  1513696     0.00     0.00  std::_List_base<Occurrence, std::allocator<Occurrence> >::__clear()
  3.63     10.37     0.46 12825272     0.00     0.00  Node::getLabelEnd()
  2.60     10.70     0.33 22536057     0.00     0.00  Node::getSequences()
  2.60     11.03     0.33 12731122     0.00     0.00  Node::getLabelLength()
  2.21     11.31     0.28 20911004     0.00     0.00  Profil::E()
  2.21     11.59     0.28 14572592     0.00     0.00  Node::getLabelBeginning()
  1.42     11.77     0.18   380842     0.00     0.00  nbSequenceInBitTabStatic(unsigned char*)
  1.38     11.94     0.18 14537633     0.00     0.00  Data::The_One_Sequence()
  1.26     12.10     0.16    98621     0.00     0.00  Profil::K()
  1.14     12.25     0.15  5658558     0.00     0.00  Node::getChild(int)
  0.87     12.36     0.11        1     0.11     0.11  std::list<Resultat, std::allocator<Resultat> >::_M_create_node(Resultat const& )
  0.55     12.43     0.07        1     0.07     0.18  std::list<Resultat, std::allocator<Resultat> >::insert(std::_List_iterator<Resultat, Resultat&, Resultat*>, Resultat const& )
  0.47     12.49     0.06                             Node::getLeafSequence()
  0.43     12.54     0.06                             Data::Input_Sequences_In_One()
  0.24     12.57     0.03     7883     0.00     0.00  Node::getSuffixLink()
  0.24     12.60     0.03                             nbSequenceInBitTabDynamic(unsigned char*)
  0.16     12.62     0.02     8531     0.00     0.00  Node::getChild(char)
  0.16     12.64     0.02        1     0.02     0.02  global constructors keyed to compteurGCOV
  0.12     12.66     0.02                             addBitTabValue(unsigned char**, int)
  0.08     12.67     0.01   378424     0.00     0.00  ReinitBitTab(unsigned char**)
  0.08     12.68     0.01      198     0.00     0.00  Node::deleteChild(int)
  0.04     12.68     0.01                             Node::getId()
  0.00     12.68     0.00   378424     0.00     0.00  Profil::Q()
  0.00     12.68     0.00    86196     0.00     0.00  Profil::N()

Reply

Marsh Posté le 17-02-2004 à 18:10:27    

enlève le unroll
 

Citation :

Pour G++3.3 et le meme exemple, il renvoie un temps total de 12.58s, et pour 2.95, ca donne 12.38s.

heink ?
 
c'est bizarre dans l'un t'as des string et l'autre des list qui prennent le pas ?
 
 
14499822 apples à string::replace ne peuvent pas disparaitre comme ça ... et list::insert ne peuvent pas apparaître comme ça ...

Reply

Marsh Posté le 17-02-2004 à 18:22:38    

si je mets juste O3 , les deux versions donnent des temps legerement moins bons, mais l'ecart reste sensiblement le meme.
 
oui g vu pour les string et les list... mais justement je sais pas pourkoi. Les 15000000 de replace sont tjs la, mais pas detectes par gprof...

Reply

Marsh Posté le 17-02-2004 à 18:25:58    

c possible que tu distribues le source pour voir ?

Reply

Marsh Posté le 17-02-2004 à 18:36:01    

oui ca peut se faire. par contre il est pas du tout pret a la distribution, et comme y a que moi qui bosse dessus, y a pas de commentaires... je v mettre qq phrases pour te permettre d'aller rapidement au fait.

Reply

Marsh Posté le 17-02-2004 à 18:39:11    

en fait j'aimerais faire les tests moi aussi
 
tu as essayé de compiler avec -Winline ? ça affiche un message quand des fonctions ne sont pas inlinées comme demandé.
 
sinon de toutes façons, on poursuivra ce sujet pour améliorer ton programme
 
 
quid de -ftracer ?


Message édité par Taz le 17-02-2004 à 18:49:17
Reply

Marsh Posté le 17-02-2004 à 18:49:42    

oui. Je fais -Wall -ansi en general...
 
ok je veux bien, mais c bizarre dans la mesure où en général les précédentes upgrades de gcc ne bouleversaient pas vraiment mes programmes, et en general donnaient des resultats similaires voire meilleurs. Mais depuis la version 3.2, c la cata. En septembre, g utilisé la 3 il me semble, et ct ok.

Reply

Marsh Posté le 17-02-2004 à 18:52:05    

compare les messages avec -Winline
 
essaie -ftracer, ça devrait (peut-etre) améliorer les choses.
 
tu as compilé en -s pour dégager les symboles ?

Reply

Marsh Posté le 17-02-2004 à 18:52:05   

Reply

Marsh Posté le 17-02-2004 à 19:05:20    

Y a aucun warning, et j'ai essayé avec -s et -ftracer.
Non ca ne change rien, desole.

Reply

Marsh Posté le 17-02-2004 à 19:08:00    

tu veux pas passer un tar.bz2 et un makefile que je puisse teste, on peut pas exclure un paquet de g++ foireux ...

Reply

Marsh Posté le 17-02-2004 à 19:13:24    

ok on fait comment ici pour t'envoyer un fichier ?

Reply

Marsh Posté le 17-02-2004 à 19:18:31    

ben soit tu le mets sur le web et tu colles un lien, soit tu me spam sur

Spoiler :

TazForEver@dlfp.org

Reply

Marsh Posté le 17-02-2004 à 19:23:10    

en tout cas sur un programme classique et simple, la taille du binaire varie déjà beaucoup ...
 

[bdejean@iplmap022 tmp]$ g++-2.95 -s -O3 -Winline  bs.cpp && ll ./a.out
-rwx------    1 bdejean  bdejean       17K 2004-02-17 19:22 ./a.out
[bdejean@iplmap022 tmp]$ g++-3.2 -s -O3 -Winline  bs.cpp && ll ./a.out
-rwx------    1 bdejean  bdejean       12K 2004-02-17 19:22 ./a.out
[bdejean@iplmap022 tmp]$ g++-3.3 -s -O3 -Winline  bs.cpp && ll ./a.out
-rwx------    1 bdejean  bdejean       11K 2004-02-17 19:22 ./a.out

Reply

Marsh Posté le 17-02-2004 à 19:27:09    

il manque rien, c bon ?

Reply

Marsh Posté le 17-02-2004 à 19:29:39    

oui g vu. pour mon prog, de memoire c pas tout a fait le double mais ca doit pas en etre loin...

Reply

Marsh Posté le 17-02-2004 à 19:31:16    

ouais j'ai comme toi pour le moment
 
3.3 TEMPS TOTAL : 9.21 sec
3.2 TEMPS TOTAL : 8.14 sec
2.95 TEMPS TOTAL : 7.6 sec
 

Reply

Marsh Posté le 17-02-2004 à 19:34:16    

c'est quoi ton processeur ?

Reply

Marsh Posté le 17-02-2004 à 19:35:31    

moi j'execute soit sur un amd 900 mhz ou un intel 800 mhz, d'ou la difference de temps.

Reply

Marsh Posté le 17-02-2004 à 19:41:54    

oui oui. c'est une peu bizarre tout ça quand même. je regarde le code. mais je vois pas de solutions pour le moment, si ce n'est continué d'utiliser g++-3.3 qui est vraiment meilleur, sauf sur ce cas précis, mais en tout cas qui supporte bien mieux l'ISO et dont la STL est plus conforme

Reply

Marsh Posté le 17-02-2004 à 19:59:24    

en tout cas ton code est pas joli joli (t'aurais pas fait du C avant ?)
 
en tout cas, vu que j'arrives vraiment avoir les différences entre les g++, tu ferais bien d'inliner un peu à la main( genre les 3/4 de Node.cpp -> Node.h, le reste du code étant particulièrement imbittable, je me suis abstenu :D)
 
tu devrais peut être soumettre ton cas sur une ml de g++

Reply

Marsh Posté le    

Reply

Sujets relatifs:

Leave a Replay

Make sure you enter the(*)required information where indicate.HTML code is not allowed