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

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre éprouvé
    Inscrit en
    Novembre 2006
    Messages
    1 073
    Détails du profil
    Informations forums :
    Inscription : Novembre 2006
    Messages : 1 073
    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 Expert
    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 : 45
    Localisation : France, Essonne (Île de France)

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

    Informations forums :
    Inscription : Septembre 2002
    Messages : 918
    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 : 50
    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
    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
    Membre éprouvé
    Inscrit en
    Novembre 2006
    Messages
    1 073
    Détails du profil
    Informations forums :
    Inscription : Novembre 2006
    Messages : 1 073
    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 Expert
    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 : 45
    Localisation : France, Essonne (Île de France)

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

    Informations forums :
    Inscription : Septembre 2002
    Messages : 918
    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 Expert
    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 : 45
    Localisation : France, Essonne (Île de France)

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

    Informations forums :
    Inscription : Septembre 2002
    Messages : 918
    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
    Membre éprouvé
    Inscrit en
    Novembre 2006
    Messages
    1 073
    Détails du profil
    Informations forums :
    Inscription : Novembre 2006
    Messages : 1 073
    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 Expert
    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 : 45
    Localisation : France, Essonne (Île de France)

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

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

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