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 :

Optimisation comparaison simple d'entier.


Sujet :

C++

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre actif
    Inscrit en
    Septembre 2010
    Messages
    73
    Détails du profil
    Informations forums :
    Inscription : Septembre 2010
    Messages : 73
    Par défaut Optimisation comparaison simple d'entier.
    Bonjour,

    j'ai simple question, pour tester qu'un entier est égale à 0.
    Est-il plus simple de faire un (i == 0) ou un (i < 1) ?

    Cela peut paraître bête mais dans ma tête le second est peut-être plus performant dans le sens ou il est plus facile de savoir si un entier est dans un intervalle que s'il est égale à une valeur exacte.

    Qu'est-ce qui se passe au niveau de la machine ?

  2. #2
    Membre confirmé
    Profil pro
    Inscrit en
    Janvier 2011
    Messages
    23
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2011
    Messages : 23
    Par défaut
    Salut,

    A mon avis c'est la même chose car l'instruction assembleur (chez intel) qui permet de comparer deux entiers c'est FCOMP.
    Cette instruction retourne 000 si > , 001 si < et 100 si ==.
    Pour plus d'info sur cette instruction regarde ce document :
    http://download.intel.com/design/Pen...s/24319102.PDF
    page 3-180.

    Par contre, cela dépend de comment de compilateur traduit. En règle générale si une optimisation existe, le compilateur fera l'optimisation en question, donc un développeur "haut niveau" c'est à dire C/C++ n'a pas à ce soucier de ce genre de problème...

    Les seules personnes qui ont à s'en soucier ce sont ceux qui développe les compilateurs, ou bien ceux qui programme en ASM...

    Bien cordialement,

    Adrien

  3. #3
    Membre Expert

    Homme Profil pro
    Développeur informatique
    Inscrit en
    Septembre 2007
    Messages
    1 895
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 49
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Opérateur de télécommunications

    Informations forums :
    Inscription : Septembre 2007
    Messages : 1 895
    Par défaut
    Citation Envoyé par abarral Voir le message
    Salut,

    A mon avis c'est la même chose car l'instruction assembleur (chez intel) qui permet de comparer deux entiers c'est FCOMP.
    Sauf que : comparer un nombre à 0, ça se fait avec une instruction or, qui met (ou non) le flag de zero à 1 en fonction de la valeur du registre comparé:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    or eax, eax  // flag de zero à mis 1 si eax == 0
    jnz @address // on saute à @address si le flags de zero 
                 // n'est pas mis (eax != 0)
    Comparer à 1, ça demande à vérifier que la valeur est effectivement 1. Plutôt que fcomp, on va charger un registre avec la valeur, et faire la comparaison
    avec cmp - ou dans certains cas, si la valeur n'est plus utilisée par la suite, décrémenter la valeur et tester contre 0 avec l'instruction or. Quoi qu'il en soit, la comparaison avec 0 est immédiate (et l'instruction est rapidement déchiffrée et exécutée ; elle peut être pairée avec une autre instruction), celle avec 1 nécessite au moins une instruction supplémentaire quelque soit le cas - du coup, le pairing des instructions sera décalé.

    Comparer à 0 est donc tout le temps préférable (il s'agit certes de micro-optimisation, mais c'est aussi une bonne pratique : on écrit if(valeur != 0), ou directement if(valeur), ce qui permet en plus d'avoir un code lisible non pollué par des valeurs de comparaison bizarres...)
    [FAQ des forums][FAQ Développement 2D, 3D et Jeux][Si vous ne savez pas ou vous en êtes...]
    Essayez d'écrire clairement (c'est à dire avec des mots français complets). SMS est votre ennemi.
    Evitez les arguments inutiles - DirectMachin vs. OpenTruc ou G++ vs. Café. C'est dépassé tout ça.
    Et si vous êtes sages, vous aurez peut être vous aussi la chance de passer à la télé. Ou pas.

    Ce site contient un forum d'entraide gratuit. Il ne s'use que si l'on ne s'en sert pas.

  4. #4
    Invité
    Invité(e)
    Par défaut
    Bonjour,

    Comparer deux entiers c'est 1 instruction assembleur le produit de cette instruction indique si c'est plus grand, plus petit ou bien égal.

    Mais pour les "plus petit que" ou "plus grand que", il y a la subtilité des nombres signés qui peut poser soucis ...

    Bref, mieux vaut tester l'égalité.

  5. #5
    Membre actif
    Inscrit en
    Septembre 2010
    Messages
    73
    Détails du profil
    Informations forums :
    Inscription : Septembre 2010
    Messages : 73
    Par défaut
    Très bien, je ne me soucierai plus de ce genre de détails.

    Merci à vous deux.

Discussions similaires

  1. [Débutant] Comparaison liste d'entiers
    Par larchicha dans le forum Général Python
    Réponses: 28
    Dernier message: 25/02/2010, 20h10
  2. Comparaison simple de variable
    Par Clemounet dans le forum Windows Forms
    Réponses: 0
    Dernier message: 16/05/2009, 11h04
  3. Comment optimiser cette simple jointure
    Par if_zen dans le forum Langage SQL
    Réponses: 4
    Dernier message: 06/08/2008, 10h00
  4. comparaison de deux entiers
    Par paolo2002 dans le forum Général JavaScript
    Réponses: 2
    Dernier message: 15/01/2008, 08h50
  5. [Sécurité] Cryptage simple d'entier
    Par Florent08800 dans le forum Langage
    Réponses: 19
    Dernier message: 13/07/2006, 15h26

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