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