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 :

Comment accelerer une fonction?


Sujet :

C++

  1. #1
    Membre confirmé
    Profil pro
    Inscrit en
    Avril 2005
    Messages
    107
    Détails du profil
    Informations personnelles :
    Localisation : Canada

    Informations forums :
    Inscription : Avril 2005
    Messages : 107
    Par défaut Comment accelerer une fonction?
    Bonjour

    dans mon programme j'utilise initialement une map de type<Material*,Cell> et j'ai une fonction num suivante:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    int num(Material *matl) {
        map<Material *,Cells>::iterator p = mat_.find(matl);
        if (p != mat_.end()) {
            return (p->second).num;
        } else {
            return (int)0;
        }
    }
    En analysant avec callgrind les fonctions qui prennent le plus de temps je me rend compte que c celle-ci qui est appeler bcp de fois et qui prend bcp de temps.
    Etant donner que la taille de la map ne depasse pas 5. Je me dis que construire l'iterateur est ce qui prend du temps.

    Du coup je pense a une alternative qui est de stoker directement les valeurs num dans un vecteur de taille 5 et d'y acceder directement genre:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    int num2(Material *matl) {
        int ind=matl->id();
        if (ind < nbmat_) {
            return mat2_[ind];
        } else {
            cout <<"Attention ca a depasser la taille de mat2_"<<endl;
            return 0;
        }
    }
    cette modification entraine bcp de changements lourds.
    C'est pourquoi avant je voudrais savoir si vouss pensez qu'une telle modification peut reellement etre benefique pour accelerer le programme.

    Merci
    Cordialement
    jeanne

  2. #2
    Membre émérite Avatar de mchk0123
    Profil pro
    Inscrit en
    Janvier 2007
    Messages
    816
    Détails du profil
    Informations personnelles :
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Janvier 2007
    Messages : 816
    Par défaut
    Est ce que tu ne pourrais pas plus simplement stocker la valeur renvoyée précédemment par "num()" dans chaque instance de Material sous une variable num ?

    Cela s'appèlle faire de la pré-calculation de fonctions : on pré-calcul les valeurs connues de retour de fonctions en début (ou en cours) de programme et puis on y accède directement dés que l'on en à besoin.

    Ca évite d'exécuter le même code à chaque fois.

    Dis moi si ca peut s'appliquer à ton cas.

  3. #3
    Membre émérite

    Profil pro
    Inscrit en
    Septembre 2006
    Messages
    717
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2006
    Messages : 717
    Par défaut
    Oui, avec peu d'éléments c'est très souvent un simple vecteur qui est la structure la plus rapide.

    Ce qui est intéressant pour tester rapidement divers conteneurs c'est d'encapsuler les fonctionnalités désirées dans une classe, de cette façon on peut changer l'implémentation (std::map ou std::vector par exemple) facilement, sans devoir faire de changements ailleurs dans le code.

  4. #4
    Membre confirmé
    Profil pro
    Inscrit en
    Avril 2005
    Messages
    107
    Détails du profil
    Informations personnelles :
    Localisation : Canada

    Informations forums :
    Inscription : Avril 2005
    Messages : 107
    Par défaut
    Est ce que tu ne pourrais pas plus simplement stocker la valeur renvoyée précédemment par "num()" dans chaque instance de Material sous une variable num ?

    Cela s'appèlle faire de la pré-calculation de fonctions : on pré-calcul les valeurs connues de retour de fonctions en début (ou en cours) de programme et puis on y accède directement dés que l'on en à besoin.
    En fait la valeur num s'applique a un Material donne et a un Noeud donne. De plus cette valeur change au cours du temps. Mon idee est de stockee pour chaque noeud la valeur num correspondant au 5 type de materiel (d'ou l'utilisation d'un vecteur)

  5. #5
    Membre confirmé
    Profil pro
    Inscrit en
    Avril 2005
    Messages
    107
    Détails du profil
    Informations personnelles :
    Localisation : Canada

    Informations forums :
    Inscription : Avril 2005
    Messages : 107
    Par défaut
    Ce qui est intéressant pour tester rapidement divers conteneurs c'est d'encapsuler les fonctionnalités désirées dans une classe, de cette façon on peut changer l'implémentation (std::map ou std::vector par exemple) facilement, sans devoir faire de changements ailleurs dans le code.
    Je ne comprend pas bien se que tu me propose de faire. Peux-tu developper un peu s'il te plait. Qu'entend-tu par "encapsuler les fonctionnalités désirées dans une classe"

    Merci

  6. #6
    Membre émérite Avatar de mchk0123
    Profil pro
    Inscrit en
    Janvier 2007
    Messages
    816
    Détails du profil
    Informations personnelles :
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Janvier 2007
    Messages : 816
    Par défaut
    Citation Envoyé par Jeane
    En fait la valeur num s'applique a un Material donne et a un Noeud donne. De plus cette valeur change au cours du temps. Mon idee est de stockee pour chaque noeud la valeur num correspondant au 5 type de materiel (d'ou l'utilisation d'un vecteur)
    Si j'ai bien compris (un peu plus de code aiderais à mieux comprendre) ça veut dire que mat_ est un std::vector() sur des instances de noeuds ???
    Comme ça par hazard, si tu as au max 5 instances de Material, tu as combien d'instances max de Noeuds ?

    Enfin ajoute le mot clef inline devant ta fonction num() :
    c'est une optimisation du compilateur qui va recopier le code compilé de la fonction partout où elle est appellée, ainsi cela supprimera le temps passé par le processeur pour "sauter" jusqu'à la fonction num() ; c'est déjà ça.

  7. #7
    Membre confirmé
    Profil pro
    Inscrit en
    Avril 2005
    Messages
    107
    Détails du profil
    Informations personnelles :
    Localisation : Canada

    Informations forums :
    Inscription : Avril 2005
    Messages : 107
    Par défaut
    Si j'ai bien compris (un peu plus de code aiderais à mieux comprendre) ça veut dire que mat_ est un std::vector() sur des instances de noeuds ???
    Comme ça par hazard, si tu as au max 5 instances de Material, tu as combien d'instances max de Noeuds ?
    a la base mat_ est une map<Material *,Cells> et c un attribut de la classe noeud. Le nombre de noeud est fixe est vaut 10*10*10 ( c un qudrillage). Chaque noeud a un certain nombre de particules (ce nombre s'appel num ) d'un type de material donnee. Si il y a 0 particule du material au noeud i alors le material n'est pas dans la map sinon il y est est le nombre de particule est socker dans cells.num.

    Enfin ajoute le mot clef inline devant ta fonction num() :
    Je pensais que cela etait utile uniquement pour les fonctions tres simple non?

  8. #8
    Membre émérite Avatar de mchk0123
    Profil pro
    Inscrit en
    Janvier 2007
    Messages
    816
    Détails du profil
    Informations personnelles :
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Janvier 2007
    Messages : 816
    Par défaut
    Citation Envoyé par Jeane
    a la base mat_ est une map<Material *,Cells> et c un attribut de la classe noeud. Le nombre de noeud est fixe est vaut 10*10*10 ( c un qudrillage). Chaque noeud a un certain nombre de particules (ce nombre s'appel num ) d'un type de material donnee. Si il y a 0 particule du material au noeud i alors le material n'est pas dans la map sinon il y est est le nombre de particule est socker dans cells.num.
    Ce que j'ai encore du mal à voir c'est si tu as 1 map en global ou bien 1 map pour chaque noeud.

    Je pensais que cela etait utile uniquement pour les fonctions tres simple non?
    Ca n'a rien à voir. Dans ton cas ca ne peut que faire du bien à la vitesse de ton programme.

  9. #9
    Membre confirmé
    Profil pro
    Inscrit en
    Avril 2005
    Messages
    107
    Détails du profil
    Informations personnelles :
    Localisation : Canada

    Informations forums :
    Inscription : Avril 2005
    Messages : 107
    Par défaut
    Ce que j'ai encore du mal à voir c'est si tu as 1 map en global ou bien 1 map pour chaque noeud.
    1 map pour chaque noeud

    Dans ton cas ca ne peut que faire du bien à la vitesse de ton programme.
    J'ai deja essayer ca ne change pas la vitesse d'execution

  10. #10
    Membre émérite Avatar de mchk0123
    Profil pro
    Inscrit en
    Janvier 2007
    Messages
    816
    Détails du profil
    Informations personnelles :
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Janvier 2007
    Messages : 816
    Par défaut
    Bon déjà avoir 1000 tables de hachages de tailles 5 c'est vraiment pas la meilleure façon de faire. Ca doit surement influer sur les faibles performances de ton programme.

  11. #11
    Membre confirmé
    Profil pro
    Inscrit en
    Avril 2005
    Messages
    107
    Détails du profil
    Informations personnelles :
    Localisation : Canada

    Informations forums :
    Inscription : Avril 2005
    Messages : 107
    Par défaut
    Justsment le choix de la map etait d'eviter de prendre trop de memoire (sa taille est compris entre 0 et 5 selon le nombre de materiel present a chaque noeud)

    tu penses que ca prend trop de memoire? C ca qui ferait ralentir?
    Du coup le choix de vecteur de int de taille 5 n'est pas non plus judicieux selon toi?

    Merci

  12. #12
    Membre émérite Avatar de mchk0123
    Profil pro
    Inscrit en
    Janvier 2007
    Messages
    816
    Détails du profil
    Informations personnelles :
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Janvier 2007
    Messages : 816
    Par défaut
    Envoi la totalité de ton code et la log de callgrind ... ca nous aidera pour t'aider.

  13. #13
    Membre confirmé
    Profil pro
    Inscrit en
    Avril 2005
    Messages
    107
    Détails du profil
    Informations personnelles :
    Localisation : Canada

    Informations forums :
    Inscription : Avril 2005
    Messages : 107
    Par défaut
    la totalite de mon code? Il est un peu ttrop gros pour ca je pense

    Je voudrais juste savoir a quelle point stocker 1000 vecteur de taille 5 peuvent faire ralentir le prog?

    encore merci

  14. #14
    Membre émérite Avatar de mchk0123
    Profil pro
    Inscrit en
    Janvier 2007
    Messages
    816
    Détails du profil
    Informations personnelles :
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Janvier 2007
    Messages : 816
    Par défaut
    Citation Envoyé par mchk0123
    Envoi la totalité de ton code et la log de callgrind ... ca nous aidera pour t'aider.
    Citation Envoyé par Jeane
    la totalite de mon code? Il est un peu ttrop gros pour ca je pense


    Bon envoi alors juste la log de callgrind ...

    Ca aidera à comprendre quel type de ralentissement tu as ... unitaire, imbriqué, durée d'exécution, fréquence d'appel, ...

    Pis ca marchait bien jusqu'à quel moment, depuis quand tu t'est rendue compte que les perfs étaient mauvaises ...

  15. #15
    Membre confirmé
    Profil pro
    Inscrit en
    Avril 2005
    Messages
    107
    Détails du profil
    Informations personnelles :
    Localisation : Canada

    Informations forums :
    Inscription : Avril 2005
    Messages : 107
    Par défaut
    desole je peux pa envoyer la log.

    Je reprend un code en fait. C pas moi qui l'ai ecrit. Je n'ai pas l'ahbitude avec les optimisation de code.

    en fait cette fonction est celle qui prend le plus de temps en "self" dans callgrind et qui est appele le plus de fois

Discussions similaires

  1. [VB.Net] Comment implémenter une fonction BitWise ?
    Par graphicsxp dans le forum VB.NET
    Réponses: 6
    Dernier message: 20/04/2005, 15h52
  2. Réponses: 8
    Dernier message: 20/12/2004, 15h14
  3. Comment lancer une fonction
    Par Elois dans le forum PostgreSQL
    Réponses: 7
    Dernier message: 21/04/2004, 19h10
  4. [VB6] Comment faire une fonction qui renvoie 2 résultats
    Par tazarine dans le forum VB 6 et antérieur
    Réponses: 10
    Dernier message: 15/01/2004, 00h13
  5. Comment chronométrer une fonction
    Par 323 dans le forum Pascal
    Réponses: 3
    Dernier message: 19/03/2003, 20h24

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