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 :

[C++] Question d'optimisation


Sujet :

C++

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre éclairé
    Inscrit en
    Septembre 2003
    Messages
    391
    Détails du profil
    Informations forums :
    Inscription : Septembre 2003
    Messages : 391
    Par défaut [C++] Question d'optimisation
    Bonjour,
    j'ai une question d'optimisation a vous poser,
    voilà j'ai une classe ItemBonus et de temps en temps je teste une collision et si c'est ok, je fais une action.
    exemple :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    void ItemBonus::collide(Uint16 cx, Uint16 cy)
    {
    // les tests
    if(status!=actif) return;
    if(/*pas collision ?*/) return;
     
    // les actions
    status=pris;
    // je fais d'autre trucs ici...
    }
    voilà, je précise que status est une donnée membre de ItemBonus (et est un enum).
    actuellement j'utilise le systeme ainsi :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    for(...) vBonus[i]->collide(x,y);
    vBonus est un vecteur.

    Jusque là ca me va pas mal, mais je me dis qu'il faudrait peu être separer la partie test de la partie action.
    Pas pour que ca soit plus propre, mais simplement pour avoir un code plus optimisé : faire une fonction plus petite qui ne fais que tester, cette fonction sera appelé souvent, et une autre : action() qui ne sera appelé que si la première retourne vrai.
    dans collide() je ne laisse que les test, ca me permet d'ajouter un const, c'est bon ca, c'est senser rendre le code plus optimisé non ?
    et creation d'une nouvelle fonction action...
    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
    bool ItemBonus::collide(Uint16 cx, Uint16 cy) const
    {
     // les tests
     if(status!=actif) return false;
     if(/*pas collision ?*/) return false;
     return true;
    }
    void ItemBonus::action()
    {
     // les actions
     status=pris;
     // je fais d'autre trucs ici...
    }
     
    // utilisation :
    for(...) if(vBonus[i]->collide(x,y)) vBonus[i]->action();
    voilà, d'un coté je rajoute un const, mais je rajoute une valeur de retour...
    En fait, je ne sais pas si c'est plus efficasse ?
    pouvez-vous me dire ce que vous en pensez ? si c'est une optimisation possible ? (je ne parle pas de beauté du code hein, bien de performance)

    Merci.

  2. #2
    Membre Expert

    Profil pro
    Inscrit en
    Juin 2006
    Messages
    1 294
    Détails du profil
    Informations personnelles :
    Localisation : Royaume-Uni

    Informations forums :
    Inscription : Juin 2006
    Messages : 1 294
    Par défaut
    Salut,

    Je pense que dans ton code ça ne change sans doute rien...
    De toute façon la règle à suivre est d'écrire le code pour la maintenance et seulement à la fin de l'application d'utiliser un outil pour inspecter les goulets d'étranglement potentiels pour optimiser uniquement ce qui est nécessaire.

    Quant à savoir si const permet au compilateur d'optimiser, la réponse est problablement non : cf. http://www.gotw.ca/gotw/081.htm

    MAT.

  3. #3
    Membre chevronné
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Mai 2006
    Messages
    366
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels

    Informations forums :
    Inscription : Mai 2006
    Messages : 366
    Par défaut
    Salut,

    La première chose à voir est la conception. Est-ce que cela a un sens de pouvoir appeler indépendamment ta fonciton de test et celle d'action ? Si oui alors fais deux fonction séparés. Si tu dois pouvoir appeler ta fonction de test indépendamment de ta fonction d'action, mais que ta fonction d'action doit obligatoirement être précédée d'un appel à ta fonction de test, encapsule un appel à ta fonction de test dans ta fonction d'action. Dans le cas contraire laisse les deux choses dans la même fonction.

    En ce qui concerne l'optimisation, dans le cas où tu sépares tes deux fonctions, tu vas rajouter un appel de fonction supplémentaire, donc des instrcutions machines supplémentaires, + 1 pour l'indirection (étant donné que tu fais l'appel via pointeur).

    Si ta fonction collide n'est pas une fonction virtuelle, cela peut être évitée en inlinant ta fonction, le compilo essayera de remplacer l'appel par le code de la fonction directement (mais rien n'est garanti).

    Enfin définir une fonction comme étant const n'est pas là pour des raisons de performance, mais pour des raisons de sémantique. Tu indiques aux utilisateurs de ta classe que la fonction ne modifiera pas l'objet.

Discussions similaires

  1. Question d'optimisation d'algo
    Par snoopo dans le forum Algorithmes et structures de données
    Réponses: 15
    Dernier message: 15/04/2007, 10h10
  2. [XNA] Question d'optimisation de chargement
    Par Myth_Titans dans le forum XNA/Monogame
    Réponses: 4
    Dernier message: 02/02/2007, 19h11
  3. Questions d'optimisation de requêtes
    Par beberd dans le forum Requêtes
    Réponses: 30
    Dernier message: 18/01/2007, 15h51
  4. question conceptuelle optimisation.
    Par mandrake_of_mandregas dans le forum Access
    Réponses: 1
    Dernier message: 29/12/2005, 10h07
  5. :?: question d'optimisation!
    Par Stopher dans le forum SQL Procédural
    Réponses: 2
    Dernier message: 21/06/2004, 17h15

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