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 :

Accélérer un calcul, accès le plus rapide aux données d'une classe


Sujet :

C++

  1. #1
    Membre habitué Avatar de Rodrigue
    Inscrit en
    Août 2002
    Messages
    487
    Détails du profil
    Informations forums :
    Inscription : Août 2002
    Messages : 487
    Points : 157
    Points
    157
    Par défaut Accélérer un calcul, accès le plus rapide aux données d'une classe
    Bonjour,

    J'essaye d'optimiser mon code pour accélérer le temps de traitement de gros calculs. Ce qui vient à m'interroger sur la conception de mes classes. C'est vraiment une question qui a l'air stupide mais bon, je vais quand même la poser!
    Il s'agit de l'accès - le plus rapide possible, bien entendu - à des variables stockées dans une classe si celles-ci sont déclarées en public ou en private.
    Par exemple, j'ai une classe Object3D qui stocke des triangles (class Triangle3D).
    Depuis mon logiciel, je dois accéder à ces triangles. Pour l'instant, j'y accède via mon object3D. Mon object Triangle est déclaré public! Or, il ne faut surtout pas qu'on puisse modifier les valeurs des triangles... Pour bien faire, il faudrait donc que je stocke cet object en private... Donc pour accéder à cet object, je devrais faire une fonction dans ma class Object3D. D'où comme il y a un appel à une fonction, cela va rallonger mon temps de calcul... A chaque fois que je ferai appel à un triangle, je devrai passer par une fonction, qui me renverra mes informations!!! Ce qui me laisse à penser qu'une solution plus jolie existe. J'en vois une, mais je ne sais pas si c'est la bonne, remplir un objet Triangle3D via un objet Object3D. Un object initialisé par une autre object, tiens je n'y connais pas grand chose là-dedans mais ça me fait penser à un design pattern ça - en cherchant sur google, je vois que c'est un factory nan ?
    Pourriez-vous me dire quelle est la solution optimale à mon accès dans ce cas précis?
    Pourriez-vous me donner des astuces du même style pour accélérer mes calculs?
    (Pourriez-vous me dire, si je me plante complètement et si mon raisonnement est faux )

    Cordialement,
    Rodrigue
    Rodrigue

  2. #2
    Membre confirmé
    Profil pro
    Inscrit en
    Juin 2005
    Messages
    464
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2005
    Messages : 464
    Points : 542
    Points
    542
    Par défaut
    Passer par un accesseur inline ne sera absolument pas pénalisant par rapport à un accès direct à une variable publique.

    Sinon un truc pour permettre au compilateur d'optimiser les accès aux données : utiliser un maximum le modificateur const : ça contribue à une meilleure gestion de la mémoire cache, et permet de lever des ambiguïtés qui empêchent certaines optimisations.
    "La forme même des Pyramides prouve que de tous temps, les ouvriers n'ont jamais pensé qu'à en faire de moins en moins."

    G. CLEMENCEAU

  3. #3
    Membre éprouvé
    Homme Profil pro
    Inscrit en
    Février 2006
    Messages
    943
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Secteur : Finance

    Informations forums :
    Inscription : Février 2006
    Messages : 943
    Points : 1 156
    Points
    1 156
    Par défaut
    En effet inline reviens a remplacer l'appel de la fonction par son code correspondant (evite la sauvegarde de contexte et tout ce que cela entraine).

    Donc tu peux en abuser sur les petites fonctions.

    Pour ce qui est de la factory elle basé sur le polymorphisme et donc les fonctions virtuelles. Si tu veux accelerer il faut eviter.

  4. #4
    Rédacteur
    Avatar de Laurent Gomila
    Profil pro
    Développeur informatique
    Inscrit en
    Avril 2003
    Messages
    10 651
    Détails du profil
    Informations personnelles :
    Âge : 40
    Localisation : France, Moselle (Lorraine)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Avril 2003
    Messages : 10 651
    Points : 15 920
    Points
    15 920
    Par défaut
    Si tu fais de la 3D, ça me paraît douteux que ce soit ce genre d'accès aux données qui pose problème. Tu as fait des mesures de performances avant d'en arriver là ?

  5. #5
    Membre habitué Avatar de Rodrigue
    Inscrit en
    Août 2002
    Messages
    487
    Détails du profil
    Informations forums :
    Inscription : Août 2002
    Messages : 487
    Points : 157
    Points
    157
    Par défaut
    Merci pour vos réponses! J'utilisais déjà inline mais je n'étais pas certains qu'à chaque fois, le compilateur remplaçait l'appel de fonction par la fonction elle-même. Je pensais que c'était le compilateur qui décidait si oui ou non il y avait lieu de le faire... Excellente information !
    utiliser un maximum le modificateur const
    A ce propos, je passe mes gros objets par référence:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    void mafonction(const &grosobjet obj) { /*...*/}
    Je ne passe donc qu'un pointeur sur mon objet et je dis au compilateur que l'on ne doit pas modifier les valeurs de l'objet: elles sont constantes. C'est ce que je veux! Le problème c'est qu'alors je ne sais plus accéder aux fonctions de mon objet:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    obj.unefonctionquelconque(...)
    Je n'ai plus accès au pointeur this. J'ai déjà vu des solutions où les fonctions étaient déclarées
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    void unefonctionquelconque(...) const
    . Je ne sais pas vraiment ce que signifie cette notation. Mais si elle fonctionne, je me vois mal faire la double déclaration à chaque fois... Y-a-t'il une astuce?
    Rodrigue

  6. #6
    Membre habitué Avatar de Rodrigue
    Inscrit en
    Août 2002
    Messages
    487
    Détails du profil
    Informations forums :
    Inscription : Août 2002
    Messages : 487
    Points : 157
    Points
    157
    Par défaut
    Citation Envoyé par Laurent Gomila
    Si tu fais de la 3D, ça me paraît douteux que ce soit ce genre d'accès aux données qui pose problème. Tu as fait des mesures de performances avant d'en arriver là ?
    Ce n'est pas de la 3D. Je ne fais qu'accéder dans une partie de mon projet à des maillages 3D et oui, j'ai fait un profiling de mon logiciel. Mais sinon j'avoue que je pose également certaines questions pour ma culture personelle
    Rodrigue

  7. #7
    Rédacteur
    Avatar de Laurent Gomila
    Profil pro
    Développeur informatique
    Inscrit en
    Avril 2003
    Messages
    10 651
    Détails du profil
    Informations personnelles :
    Âge : 40
    Localisation : France, Moselle (Lorraine)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Avril 2003
    Messages : 10 651
    Points : 15 920
    Points
    15 920
    Par défaut
    Une fonction const est une fonction qui ne va pas modifier l'état de l'instance courante (ne pas modifier ses données membres, et ne pas appeler de fonction membre non-const). A mettre donc pour toute fonction qui s'y prête.

    Et si la fonction qui prend une référence constante de ton objet a besoin d'appeler des fonctions ne pouvant pas être constantes sur celui-ci, alors il ne faut pas prendre une référence constante en paramètre.

    Ce n'est pas de la 3D. Je ne fais qu'accéder dans une partie de mon projet à des maillages 3D et oui, j'ai fait un profiling de mon logiciel
    Ok, bien

    J'utilisais déjà inline mais je n'étais pas certains qu'à chaque fois, le compilateur remplaçait l'appel de fonction par la fonction elle-même. Je pensais que c'était le compilateur qui décidait si oui ou non il y avait lieu de le faire...
    C'est bien le cas, le compilo a toujours le dernier mot. Par contre pour des accesseurs triviaux ça ne posera jamais de problème, aucun souci.

  8. #8
    Membre habitué Avatar de Rodrigue
    Inscrit en
    Août 2002
    Messages
    487
    Détails du profil
    Informations forums :
    Inscription : Août 2002
    Messages : 487
    Points : 157
    Points
    157
    Par défaut
    J'ai toujours une question à propos des variables constantes. Mes objets Triangle3D sont initialisés lors de la lecture d'un fichier par mon object Object3D. Après, ils ne sont plus jamais modifiés. Je suppose qu'il y a donc moyen de déclarer mes Triangle3D avec le mot clé const. Comment faut-il procéder?
    Dois-je déclarer ma fonction d'initialisation const et ainsi modifier mes objets Triangle3D dedans?
    Rodrigue

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

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

    Informations forums :
    Inscription : Septembre 2005
    Messages : 27 379
    Points : 41 573
    Points
    41 573
    Par défaut
    À moins de faire l'initialisation dans les constructeurs, je ne pense pas que tu puisse mettre de const.
    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. #10
    Membre éprouvé
    Homme Profil pro
    Inscrit en
    Février 2006
    Messages
    943
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Secteur : Finance

    Informations forums :
    Inscription : Février 2006
    Messages : 943
    Points : 1 156
    Points
    1 156
    Par défaut
    a noter que si l'implementation est dans le .h , le compilateur te la basculera en inline automatiquement.

  11. #11
    Membre émérite
    Avatar de Ti-R
    Homme Profil pro
    Ingénieur R&D
    Inscrit en
    Avril 2003
    Messages
    1 683
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : France, Hauts de Seine (Île de France)

    Informations professionnelles :
    Activité : Ingénieur R&D
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Avril 2003
    Messages : 1 683
    Points : 2 568
    Points
    2 568
    Par défaut
    On peut utiliser const et quand même écrire dedans.
    La syntaxe est pas super sympa.

    const est juste la pour dire aux utilisateurs de la class, attentions la valeur est constante, il ne faut pas la toucher, même si on peut le faire. C'est seulement une mise en garde.

    ex
    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
    30
    31
    32
    33
    34
    35
    #include <cstdlib>
    #include <iostream>
     
    using namespace std;
     
    class a
    {
    	const int i;
     
    	public:
     
    	a():i(5){}
     
    	int Value()
    	{
    		return i;
    	}
     
    	void ConstValue()
    	{
    		*((int*)&i) = 10;
    	}
     
    };
     
    int main(int argc, char *argv[])
    {
    	a t_a;
    	cout << "a.i: " << t_a.Value() << endl;
    	t_a.ConstValue();
    	cout << "a.i: " << t_a.Value() << endl;
     
        system("PAUSE");
        return EXIT_SUCCESS;
    }

  12. #12
    Rédacteur
    Avatar de Laurent Gomila
    Profil pro
    Développeur informatique
    Inscrit en
    Avril 2003
    Messages
    10 651
    Détails du profil
    Informations personnelles :
    Âge : 40
    Localisation : France, Moselle (Lorraine)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Avril 2003
    Messages : 10 651
    Points : 15 920
    Points
    15 920
    Par défaut
    a noter que si l'implementation est dans le .h , le compilateur te la basculera en inline automatiquement
    Remplacer la fin par "l'éditeur de lien te balancera automatiquement des erreurs de définition multiple"
    Tu voulais sûrement parler des fonctions membres implémentées à l'intérieur de la définition de leur classe ?

    Autant faire du crade classe :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    const_cast<int&>(i) = 10;

  13. #13
    Expert éminent sénior
    Avatar de Médinoc
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Septembre 2005
    Messages
    27 379
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : France

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

    Informations forums :
    Inscription : Septembre 2005
    Messages : 27 379
    Points : 41 573
    Points
    41 573
    Par défaut
    Pour çà, moi j'utiliserais plutôt:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    const_cast< a * >(this)->i = 10;
    Mais pour une fonction qui ne fait QUE ça, autant ne pas la déclarer const, quitte à faire le const_cast dans la fonction appelante.
    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.

  14. #14
    Membre expérimenté
    Profil pro
    Inscrit en
    Juin 2006
    Messages
    1 354
    Détails du profil
    Informations personnelles :
    Âge : 49
    Localisation : France

    Informations forums :
    Inscription : Juin 2006
    Messages : 1 354
    Points : 1 419
    Points
    1 419
    Par défaut
    a mon avis, ce n'est pas l'acces au donnees d'une classe qu'il faut chercher a optimiser, mais ta structure de données: un octree ? etc...
    et bien sur les algos...

    mais la structure de données est vitale.

    ... peut etre tu peux nous en dire plus ?

    a+

  15. #15
    Rédacteur
    Avatar de Laurent Gomila
    Profil pro
    Développeur informatique
    Inscrit en
    Avril 2003
    Messages
    10 651
    Détails du profil
    Informations personnelles :
    Âge : 40
    Localisation : France, Moselle (Lorraine)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Avril 2003
    Messages : 10 651
    Points : 15 920
    Points
    15 920
    Par défaut
    Pour çà, moi j'utiliserais plutôt:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    const_cast< a * >(this)->i = 10;
    Ce n'est pas pareil : dans l'exemple de Ti-R i est const et pas la fonction ; dans le tien (qui correspond plus au sujet d'ailleurs) c'est l'inverse.

  16. #16
    Membre éprouvé
    Homme Profil pro
    Inscrit en
    Février 2006
    Messages
    943
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Secteur : Finance

    Informations forums :
    Inscription : Février 2006
    Messages : 943
    Points : 1 156
    Points
    1 156
    Par défaut
    Citation Envoyé par Laurent Gomila
    Remplacer la fin par "l'éditeur de lien te balancera automatiquement des erreurs de définition multiple"
    Tu voulais sûrement parler des fonctions membres implémentées à l'intérieur de la définition de leur classe ?
    [/CODE]
    bien entendu implementer les accesseurs dans leur definition

Discussions similaires

  1. Accès aux données d'une classe par plusieurs threads
    Par Dalini71 dans le forum Threads & Processus
    Réponses: 3
    Dernier message: 08/12/2013, 07h23
  2. [Android] Velocity : accès rapide aux données des stations LE vélo STAR
    Par mickaellf dans le forum Mon application mobile
    Réponses: 0
    Dernier message: 25/08/2011, 15h07
  3. Mode d'accès le plus rapide ?
    Par QAYS dans le forum Bases de données
    Réponses: 4
    Dernier message: 17/10/2007, 10h38
  4. Acces rapide aux données
    Par new.proger dans le forum JDBC
    Réponses: 4
    Dernier message: 18/07/2007, 15h19
  5. Accès le plus rapide: Pointeur ou tableau?
    Par homeostasie dans le forum C
    Réponses: 21
    Dernier message: 01/09/2006, 14h08

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