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 :

L'utilisation d'une classe perso ralentit énormement mon programme


Sujet :

C++

  1. #21
    Membre confirmé
    Homme Profil pro
    Étudiant
    Inscrit en
    Mai 2013
    Messages
    113
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Mai 2013
    Messages : 113
    Par défaut
    Le voila

    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
    22
    23
    24
    25
    26
    27
    28
    29
    matrix &matrix::operator =(const matrix &A)
    {
        if (this == &A)
        {
            return *this;
        }
        else
        {
            if (m_dim_i!= A.m_dim_i||m_dim_j!= A.m_dim_j)
            {
                this->~matrix();
            }
        }
     
        m_dim_i= A.m_dim_i;
        m_dim_j= A.m_dim_j;
     
        p = new double[m_dim_i*m_dim_j];
     
        for (int i = 0; i <m_dim_i; i++)
        {
            for (int j = 0; j <m_dim_j; j++)
            {
                p[m_dim_i*i+j] = A.p[m_dim_i*i+j];
            }
        }
     
        return *this;
    }
    Comme lors de mon test je ne l'utilisais pas je me suis dis que le problème ne venait pas de la !

  2. #22
    Membre éclairé Avatar de GrosLapin
    Homme Profil pro
    Ingénieur et Etudiant
    Inscrit en
    Avril 2013
    Messages
    47
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 37
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur et Etudiant

    Informations forums :
    Inscription : Avril 2013
    Messages : 47
    Par défaut
    Quand tu fais A(3) ça donne dim_i = 3 dim_j = 1. Du coup à l'affichage tu affiches 0 3 6 alors que tu devrais afficher 0 1 2 du coup tu as que 0 de bon

  3. #23
    Rédacteur/Modérateur


    Homme Profil pro
    Network game programmer
    Inscrit en
    Juin 2010
    Messages
    7 181
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 39
    Localisation : Canada

    Informations professionnelles :
    Activité : Network game programmer

    Informations forums :
    Inscription : Juin 2010
    Messages : 7 181
    Billets dans le blog
    4
    Par défaut
    Bonsoir,

    à vue de nez, je dirais que ça sent les copies non maîtrisées dans tous les sens.
    Cela dit, on voit pas grand chose de l'implémentation et utilisation..
    Pensez à consulter la FAQ ou les cours et tutoriels de la section C++.
    Un peu de programmation réseau ?
    Aucune aide via MP ne sera dispensée. Merci d'utiliser les forums prévus à cet effet.

  4. #24
    Expert éminent
    Avatar de Médinoc
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Septembre 2005
    Messages
    27 409
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France

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

    Informations forums :
    Inscription : Septembre 2005
    Messages : 27 409
    Par défaut
    1. haraelendil a dit constructeur de copie, pas opérateur d'affectation
    2. Cet opérateur d'affectation est une horreur. Tu devrais implémenter un constructeur de copie correct et utiliser l'idiome copy-and-swap quand les dimensions ne sont pas égales, ce sera beaucoup plus propre.

    PS: Ton constructeur matrix(int dim_i) devrait être déclaré explicit.
    SVP, pas de questions techniques par MP. Surtout si je ne vous ai jamais parlé avant.

    "Aw, come on, who would be so stupid as to insert a cast to make an error go away without actually fixing the error?"
    Apparently everyone.
    -- Raymond Chen.
    Traduction obligatoire: "Oh, voyons, qui serait assez stupide pour mettre un cast pour faire disparaitre un message d'erreur sans vraiment corriger l'erreur?" - Apparemment, tout le monde. -- Raymond Chen.

  5. #25
    Membre confirmé
    Homme Profil pro
    Étudiant
    Inscrit en
    Mai 2013
    Messages
    113
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Mai 2013
    Messages : 113
    Par défaut
    J'ai trouvé mon problème, en fait je remplissais ma matrice en faisant dim_i*i+j au lieu de dim_j*i+j ! Erreur idiote !

    Sinon j'ai aussi ajouté le constructeur par copie que j'avais en effet oublié alors que je l'utilisais

    Mais pour ce qui est du temps de calcul et bien c'est pire ! 88 secondes

  6. #26
    Membre confirmé
    Profil pro
    Inscrit en
    Avril 2009
    Messages
    199
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2009
    Messages : 199
    Par défaut
    Si tu veux savoir où se trouve tes goulots d'étranglement , utilise un profileur !

    Mais je pense que si tu as du calcul instance , ton ralentissement doit provenir de tes allocations mémoire avec new. En effet, chaque fois que tu crées, copies
    ou même multiplies deux matrices tu fais une allocation.

    Le profileur de donneras de très bons résultats, mais si tu as des matrices de taille petites alors tout ton temps sera passé dans les allocations dynamiques sûrement !

    P.S. Si tu connais tes tailles de matrice en avances, tu pourras peut être utiliser std::array qui alloue sur la pile. Et avec quelques expressions templates et un bon niveau d'optimisation tu sortiras touts les objets temporaires : ce sont quelques techniques utilisées dans les bibliothèques matricielles. Et si tu veux aller plus moins renseignes toi sur l'alignement mémoire, les instructions simd (c.f. Boost.simd qui nous tarde tous ), etc.

  7. #27
    Membre Expert Avatar de jabbounet
    Homme Profil pro
    Consultant informatique
    Inscrit en
    Juin 2009
    Messages
    1 909
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 50

    Informations professionnelles :
    Activité : Consultant informatique

    Informations forums :
    Inscription : Juin 2009
    Messages : 1 909
    Par défaut
    As-tu réellement besoin d'une allocation dynamique pour tes matrices?

    Dans la plupart des application ou j'ai pu rencontrer ce type d'implémentation les matrices ne dépassaient pas une taille fixe...

    Un new (allocation sur le tas) coute infiniment plus cher par rapport à une allocation sur la pile.

    Après tu peux aussi essayer de porter certain principes utilisés pour les string comme le short string optimisation (SSO) ou le copy on write.

  8. #28
    Membre Expert

    Inscrit en
    Mai 2008
    Messages
    1 014
    Détails du profil
    Informations forums :
    Inscription : Mai 2008
    Messages : 1 014
    Par défaut
    +1 avec jabbounet
    C'est vrai qu'il y a un truc pas clair dans le premier post, le PO dit qu'il est passé d'un style "qui utilise à l'origine des tableaux 2D" à sa prpore classe matrix, ce qui donnent l'impression qu'il est passé d'un truc du style double mat[10][10]; (sur la pile) à matrix mat(10, 10); (sur le tas avec new) ce qui serais évidemment une méga catastrophe.

  9. #29
    Expert éminent
    Avatar de Médinoc
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Septembre 2005
    Messages
    27 409
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France

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

    Informations forums :
    Inscription : Septembre 2005
    Messages : 27 409
    Par défaut
    S'il y a beaucoup de créations et destructions et que la taille est fixe, matrix<double, 10, 10> mat; pourrait être un meilleur choix en effet.
    SVP, pas de questions techniques par MP. Surtout si je ne vous ai jamais parlé avant.

    "Aw, come on, who would be so stupid as to insert a cast to make an error go away without actually fixing the error?"
    Apparently everyone.
    -- Raymond Chen.
    Traduction obligatoire: "Oh, voyons, qui serait assez stupide pour mettre un cast pour faire disparaitre un message d'erreur sans vraiment corriger l'erreur?" - Apparemment, tout le monde. -- Raymond Chen.

  10. #30
    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 : 46
    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 victor_gasgas Voir le message
    (c.f. Boost.simd qui nous tarde tous ), etc.
    oh y a eu une beta y a 4 mois et y en a une aurte bientot :o

  11. #31
    Membre confirmé
    Homme Profil pro
    Étudiant
    Inscrit en
    Mai 2013
    Messages
    113
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Mai 2013
    Messages : 113
    Par défaut
    Je suis effectivement passé d'un

    à un

    avec les new

    par ce que je ne connais pas à la compilation la taille des matrices que je vais utiliser (elle est entrée dans ma GUI).

    Donc en fait c'est bien la déclaration en dynamique qui coute cher en temps et pas une erreur de programmation de ma part (je suis en train d'apprendre le c++ alors je me méfie de mes erreurs ^^).

    Je pense que je vais donc "abandonner" puisque j'ai déjà codé une classe matrice avec des vectors, avec des tableaux 2D et avec des tableaux linéaire (dim_j*i+j) cela m'a permis de comprendre un peu le principe de tout cela et je vais me tourner pour les usages vers la bibliothèque boost je pense .

    A moins que vous ayez une meilleure bibliothèque à me conseiller ?

  12. #32
    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 : 46
    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
    pas boost.ublas, les performances sont bof bof

  13. #33
    Membre Expert Avatar de jabbounet
    Homme Profil pro
    Consultant informatique
    Inscrit en
    Juin 2009
    Messages
    1 909
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 50

    Informations professionnelles :
    Activité : Consultant informatique

    Informations forums :
    Inscription : Juin 2009
    Messages : 1 909
    Par défaut
    Citation Envoyé par kipgon Voir le message
    Je suis effectivement passé d'un

    à un

    avec les new

    par ce que je ne connais pas à la compilation la taille des matrices que je vais utiliser (elle est entrée dans ma GUI).
    La matrice est entrée dans une GUI, si c'est manuel je pense que tu peux utiliser une taille fixe max de 100x100 par exemple et n'utiliser qu'une sous partie de la matrice.
    je ne pense pas qu'un utilisateur entrera manuellement une matrice 100x100, ou alors il a du temps a perdre.

    Autrement tu peux très bien avoir en interne dans ton objet une matrice de taille fixe alloué sur la pile pour gérer les matrices de petites taille et un pointeur pour gérer les matrices de grande taille (que te n'allouera que dans le cas ou l'utilisateur souhaite bosser avec des matrice dépassant la taille de la matrice alloué sur la pile), ce serait une espèce d'équivalent au short string optimisation (SSO) suggéré avant.


    Autre possibilité, faire une pré-allocation à l'initialisation ton application et s'en servir comme cache pour stocker les matrices mais cela nécessite de bien gérer cet espace mémoire et ce sera de toute façon moins efficace que de mettre les matrices sur la pile.

+ Répondre à la discussion
Cette discussion est résolue.
Page 2 sur 2 PremièrePremière 12

Discussions similaires

  1. Réponses: 3
    Dernier message: 05/12/2012, 03h26
  2. Utiliser les méthodes ror dans une class perso
    Par BakaOnigiri dans le forum Ruby on Rails
    Réponses: 10
    Dernier message: 01/02/2010, 12h01
  3. [POO] Utilisation d'une classe pdo perso
    Par artotal dans le forum Langage
    Réponses: 11
    Dernier message: 05/04/2008, 03h47
  4. pb utilisation d'une classe perso
    Par sharivaree dans le forum Général JavaScript
    Réponses: 2
    Dernier message: 14/12/2006, 18h44
  5. Utilisation iterator avec une classe perso
    Par SteelBox dans le forum C++
    Réponses: 19
    Dernier message: 07/03/2005, 11h30

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