IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

C++ Discussion :

Les templates et les performances.


Sujet :

C++

  1. #1
    Débutant  
    Inscrit en
    Novembre 2006
    Messages
    1 073
    Détails du profil
    Informations forums :
    Inscription : Novembre 2006
    Messages : 1 073
    Points : 217
    Points
    217
    Par défaut Les templates et les performances.
    Bonjour,
    j'ai tenté de comparer les performances d'algorithmes basés sur l'utilisation de template.
    J'ai voulu comparer le temps de calcul basés sur de prog différents qui font la même chose: on a un vecteur de paire<int,int> aléatoires. Le but est de compter le nombres de paires dont la première coordonnées est inférieur à 10. Ce vecteur contient 1000000 paires.

    Le premier utilise les templates de la STL:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
     
    for(int od=0;od<10;od++)
    	{
    	time_t start,end;
    	double dif;
    	int o=0;
    	time (&start);
    for(int r=1;r<5;r++){
     
    	std::vector<pair<int,int>> VN;
    	fff(VN);// Cette fonction génère le vecteur aléatoire. 
    o=o+ count_if(VN.begin(), VN.end(),bind(tr1::cref(bind1st(less<int>(), 10))  ,(std::bind<int&>(std::get<0, int , int>, _1))));
     
    }	 
     
    }
     
    	time (&end);
        dif = difftime (end,start);
    	fffd=fffd+dif;
    }

    Le deuxième utilise une bonne vieille boucle if et for:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
     
    for(int od=0;od<10;od++)
    	{
    	time_t start,end;
    	double dif;
    	int o=0;
    	time (&start);
    for(int r=1;r<5;r++){
     
    	std::vector<pair<int,int>> VN;
    	fff(VN);// Cette fonction génère le vecteur aléatoire. 
     for(iterator k=VN.begin();k!=VN.end();k++){
    if((*k).first<10) o=o+1;
    }	 
     
    }
     
    	time (&end);
        dif = difftime (end,start);
    	fffd=fffd+dif;
    }
    Hé bien malgré l'utilisation de ces templates, la boucle for-if reste supérieure en performances, puisque fffd dans le premier cas vaut 160, alors que dans le deuxième il faut 140.
    Je pense que c'est l'utilisation des 3 bind qui fait que cela ralenti le calcul.
    Je ne suis pas assez calé pour améliorer mon code, mais si vous avez des idées.

  2. #2
    Membre chevronné
    Avatar de Joel F
    Homme Profil pro
    Chercheur en informatique
    Inscrit en
    Septembre 2002
    Messages
    918
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Chercheur en informatique
    Secteur : Service public

    Informations forums :
    Inscription : Septembre 2002
    Messages : 918
    Points : 1 921
    Points
    1 921
    Par défaut
    vu que bind fais des copies de pointeur de fonction et qu'un pointeur de fonction n'est pas inlinable, ca me parait raisonnable comme résultat.

    - les pb de pefs vient de bind et non de vector :o
    - comment mesures tu ton temps d'execution, tu prends bien entendu le temps médian de 10^4+ executions.
    - je pense aussi que tu bench le temps d'allocation de ton vector dans ta boucle interne :o
    - Essaye avec boost.lambda ou phoenix qui eux devrait s'inliner.
    - que dit gprof ?

  3. #3
    Rédacteur/Modérateur
    Avatar de JolyLoic
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Août 2004
    Messages
    5 463
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 49
    Localisation : France, Yvelines (Île de France)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Août 2004
    Messages : 5 463
    Points : 16 213
    Points
    16 213
    Par défaut
    Citation Envoyé par Joel F Voir le message
    - Essaye avec boost.lambda ou phoenix qui eux devrait s'inliner.
    Deux autres essais intéressants sont avec les lambdas de c++0x, et avec un foncteur fait à la main.
    Ma session aux Microsoft TechDays 2013 : Développer en natif avec C++11.
    Celle des Microsoft TechDays 2014 : Bonnes pratiques pour apprivoiser le C++11 avec Visual C++
    Et celle des Microsoft TechDays 2015 : Visual C++ 2015 : voyage à la découverte d'un nouveau monde
    Je donne des formations au C++ en entreprise, n'hésitez pas à me contacter.

  4. #4
    Débutant  
    Inscrit en
    Novembre 2006
    Messages
    1 073
    Détails du profil
    Informations forums :
    Inscription : Novembre 2006
    Messages : 1 073
    Points : 217
    Points
    217
    Par défaut
    les pb de pefs vient de bind et non de vector :o
    C'est ce que je pense. Mais je pense quisi qu'il doit y avoir moyen de supprimer un peu le nombre de bind. Il y en a trois. Ca fait bcp.


    Essaye avec boost.lambda ou
    hmm. C'est deja plus difficile a utiliser.

    phoenix qui eux devrait s'inliner.
    connais pas

    - que dit gprof ?
    connais pas

  5. #5
    Membre chevronné
    Avatar de Joel F
    Homme Profil pro
    Chercheur en informatique
    Inscrit en
    Septembre 2002
    Messages
    918
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Chercheur en informatique
    Secteur : Service public

    Informations forums :
    Inscription : Septembre 2002
    Messages : 918
    Points : 1 921
    Points
    1 921
    Par défaut
    Citation Envoyé par deubelte Voir le message
    hmm. C'est deja plus difficile a utiliser.
    Guere , ca permet deja de faire sauter le bind sur less

    Citation Envoyé par deubelte Voir le message
    connais pas
    http://www.boost.org/doc/libs/1_44_0...tml/index.html

    Citation Envoyé par deubelte Voir le message
    connais pas
    le profiler de gcc quoi ...
    man gprof :o

  6. #6
    Membre chevronné
    Avatar de Joel F
    Homme Profil pro
    Chercheur en informatique
    Inscrit en
    Septembre 2002
    Messages
    918
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Chercheur en informatique
    Secteur : Service public

    Informations forums :
    Inscription : Septembre 2002
    Messages : 918
    Points : 1 921
    Points
    1 921
    Par défaut
    Citation Envoyé par JolyLoic Voir le message
    Deux autres essais intéressants sont avec les lambdas de c++0x, et avec un foncteur fait à la main.
    Je t'avoue que la, je ferais effectivement un foncteur

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
     
    struct compare_first
    {
      compare_first(int v) : value(v) {}
      bool operator()( std::pair<int,in> const& p )  { return p.first<value; }
      int value;
    };
     
    count_if(VN.begin(), VN.end(), compare_first(10) );

  7. #7
    Débutant  
    Inscrit en
    Novembre 2006
    Messages
    1 073
    Détails du profil
    Informations forums :
    Inscription : Novembre 2006
    Messages : 1 073
    Points : 217
    Points
    217
    Par défaut
    Je t'avoue que la, je ferais effectivement un foncteur
    Le but etait d'utiliser le plus possible de fonctions déjà implémentées. Enfin, de réduire au plus possible le code. De tout internatiliser

  8. #8
    Membre chevronné
    Avatar de Joel F
    Homme Profil pro
    Chercheur en informatique
    Inscrit en
    Septembre 2002
    Messages
    918
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Chercheur en informatique
    Secteur : Service public

    Informations forums :
    Inscription : Septembre 2002
    Messages : 918
    Points : 1 921
    Points
    1 921
    Par défaut
    vu le truc, ca mange pas beaucoup :€
    Tu colles ça dans un namespace details et hop

  9. #9
    Débutant  
    Inscrit en
    Novembre 2006
    Messages
    1 073
    Détails du profil
    Informations forums :
    Inscription : Novembre 2006
    Messages : 1 073
    Points : 217
    Points
    217
    Par défaut
    vu le truc, ca mange pas beaucoup :€
    Tu colles ça dans un namespace details et hop
    De toute facon, j'ai essayé avec un foncteur, ca ne change pas grand chose, même inliné

  10. #10
    Membre chevronné
    Avatar de Joel F
    Homme Profil pro
    Chercheur en informatique
    Inscrit en
    Septembre 2002
    Messages
    918
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Chercheur en informatique
    Secteur : Service public

    Informations forums :
    Inscription : Septembre 2002
    Messages : 918
    Points : 1 921
    Points
    1 921
    Par défaut
    tu ne m'as toujours pas dit comment tu bench

  11. #11
    Débutant  
    Inscrit en
    Novembre 2006
    Messages
    1 073
    Détails du profil
    Informations forums :
    Inscription : Novembre 2006
    Messages : 1 073
    Points : 217
    Points
    217
    Par défaut
    c'est dans mon code.
    Je fais la différence entre start et end:

    dif = difftime (end,start);


    qu'appelles tu par bencher?

  12. #12
    Membre émérite

    Inscrit en
    Mai 2008
    Messages
    1 014
    Détails du profil
    Informations forums :
    Inscription : Mai 2008
    Messages : 1 014
    Points : 2 252
    Points
    2 252
    Par défaut
    Citation Envoyé par deubelte Voir le message
    De toute facon, j'ai essayé avec un foncteur, ca ne change pas grand chose, même inliné
    Ce qui veut dire que tu t'es gouré en mesurant.

    L'implémentation de count_if étant simplissime, il est quasi impossible d'avoir une différence de perf entre une boucle à la main ou un count_if+foncteur, vu que le code est identique...

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
     
    // count_if (un poil simplifié) de vs2010)
    template<class _InIt,class _Pr> 
    int _Count_if(_InIt _First, _InIt _Last, _Pr _Pred)
    {	// count elements satisfying _Pred
       int _Count = 0;
     
       for (; _First != _Last; ++_First)
          if (_Pred(*_First))
             ++_Count;
       return (_Count);
     
    // ta boucle
       int o=0;
       for(iterator k=VN.begin();k!=VN.end();k++){
          if((*k).first<10) 
             o=o+1;
    }
    Ceci-dit, perso, count_if fait parti de la liste des algo que je n'utilise jamais (avec for_each et transform) car la boucle écrite à la main est plus courte et tout aussi claire à mon gout.

  13. #13
    Membre éprouvé
    Profil pro
    Inscrit en
    Mai 2006
    Messages
    780
    Détails du profil
    Informations personnelles :
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations forums :
    Inscription : Mai 2006
    Messages : 780
    Points : 1 176
    Points
    1 176
    Par défaut
    transform, for_each, c'est quand même bien utile. Enfin quand on a pris goût aux algorithmes.

  14. #14
    Membre chevronné
    Avatar de poukill
    Profil pro
    Inscrit en
    Février 2006
    Messages
    2 155
    Détails du profil
    Informations personnelles :
    Âge : 40
    Localisation : France

    Informations forums :
    Inscription : Février 2006
    Messages : 2 155
    Points : 2 107
    Points
    2 107
    Par défaut
    Citation Envoyé par nikko34 Voir le message
    transform, for_each, c'est quand même bien utile. Enfin quand on a pris goût aux algorithmes.
    Surtout quand on commence à toucher aux expression template. Quand on ne manipule plus que des foncteurs, std::for_each, std::transform & Co sont plutot pas mal !

  15. #15
    Débutant  
    Inscrit en
    Novembre 2006
    Messages
    1 073
    Détails du profil
    Informations forums :
    Inscription : Novembre 2006
    Messages : 1 073
    Points : 217
    Points
    217
    Par défaut
    Ce qui veut dire que tu t'es gouré en mesurant.
    Perso, je vois pas ou je me suis planté. Peut etre que l'inlining à un effet, mais il est tres faible.

  16. #16
    yan
    yan est déconnecté
    Rédacteur
    Avatar de yan
    Homme Profil pro
    Ingénieur expert
    Inscrit en
    Mars 2004
    Messages
    10 033
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Ille et Vilaine (Bretagne)

    Informations professionnelles :
    Activité : Ingénieur expert
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Mars 2004
    Messages : 10 033
    Points : 13 968
    Points
    13 968
    Par défaut
    Citation Envoyé par Arzar Voir le message
    il est quasi impossible d'avoir une différence de perf entre une boucle à la main ou un count_if+foncteur, vu que le code est identique...
    Normalement pas forcement.
    La boucle à la main est au mieux aussi rapide. Mais suivant le type du conteneur, les algo peuvent aller plus vite car la STL connait la meilleur façon de parcourir.
    Sous visual, normalement le foreach n'utilise pas vraiment les iterateur.
    [edit]
    un peu de lecture
    http://www.drdobbs.com/184401446

  17. #17
    Débutant  
    Inscrit en
    Novembre 2006
    Messages
    1 073
    Détails du profil
    Informations forums :
    Inscription : Novembre 2006
    Messages : 1 073
    Points : 217
    Points
    217
    Par défaut
    La boucle à la main est au mieux aussi rapide.
    C'est ce que je croyais. D'un autre coté, les compilos savent etllement bien optimiser que je me demande vraiment si on va voir une différence ou non.
    Estce que cela vaut le coup de se casser le ... à faire des trucs compliqués??


    N'empeche que j'ai testé avec un vector de doubles et un count_if qui regarde si oui ou non les chifres sont > à un certain seuil. Hé bien le programme allait un peu plus vite.

  18. #18
    yan
    yan est déconnecté
    Rédacteur
    Avatar de yan
    Homme Profil pro
    Ingénieur expert
    Inscrit en
    Mars 2004
    Messages
    10 033
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Ille et Vilaine (Bretagne)

    Informations professionnelles :
    Activité : Ingénieur expert
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Mars 2004
    Messages : 10 033
    Points : 13 968
    Points
    13 968
    Par défaut
    Faut ce mefier de ce type de bench. Je me suis fait avoir plus d'une fois où en regardant de plus prêt, je ne comparai pas la même choses..
    Dans ton cas, si j'ai bien compris, c'est les bind qui ralentit un peu. Sans compter que mesure le temps d'allocation de ton vecteur. Ce qu'il faut éviter.

    Si tu cherche sur le forum je pense que tu devrais retrouver facilement mes postes avec des bench bancale

  19. #19
    Membre actif
    Profil pro
    Inscrit en
    Août 2007
    Messages
    190
    Détails du profil
    Informations personnelles :
    Localisation : France, Maine et Loire (Pays de la Loire)

    Informations forums :
    Inscription : Août 2007
    Messages : 190
    Points : 219
    Points
    219
    Par défaut
    Salut,

    Quelles options as-tu utilisé pour compiler ton programme ?

  20. #20
    Débutant  
    Inscrit en
    Novembre 2006
    Messages
    1 073
    Détails du profil
    Informations forums :
    Inscription : Novembre 2006
    Messages : 1 073
    Points : 217
    Points
    217
    Par défaut
    Salut,

    Quelles options as-tu utilisé pour compiler ton programme ?
    De quel type d'options parles tu? Plus précisément stp?

Discussions similaires

  1. [Xtext] Problème avec les templates pour les mots clé
    Par P1t0u dans le forum Eclipse Platform
    Réponses: 0
    Dernier message: 10/06/2010, 15h53
  2. les classes et les templates dans les plugins
    Par asoka13 dans le forum C++
    Réponses: 22
    Dernier message: 24/01/2008, 17h11
  3. Java 5.0, les templates et les arrays
    Par anykeyh dans le forum Collection et Stream
    Réponses: 4
    Dernier message: 20/12/2005, 22h14

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo