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

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre éclairé Avatar de Rodrigue
    Inscrit en
    Août 2002
    Messages
    487
    Détails du profil
    Informations forums :
    Inscription : Août 2002
    Messages : 487
    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

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

    Informations forums :
    Inscription : Juin 2005
    Messages : 464
    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.

  3. #3
    Membre émérite
    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
    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 : 41
    Localisation : France, Moselle (Lorraine)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Avril 2003
    Messages : 10 651
    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 éclairé Avatar de Rodrigue
    Inscrit en
    Août 2002
    Messages
    487
    Détails du profil
    Informations forums :
    Inscription : Août 2002
    Messages : 487
    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?

  6. #6
    Membre éclairé Avatar de Rodrigue
    Inscrit en
    Août 2002
    Messages
    487
    Détails du profil
    Informations forums :
    Inscription : Août 2002
    Messages : 487
    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

  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 : 41
    Localisation : France, Moselle (Lorraine)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Avril 2003
    Messages : 10 651
    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.

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