Ce qui est plus rapide : si (bool) ou si(int)?

Dont la valeur est préférable d'utiliser? Boolean true ou un Entier de 1?

Le thème m'a fait faire quelques expériences avec bool et int dans if condition. Donc, juste par curiosité, j'ai écrit ce programme:

int f(int i) 
{
    if ( i ) return 99;   //if(int)
    else  return -99;
}
int g(bool b)
{
    if ( b ) return 99;   //if(bool)
    else  return -99;
}
int main(){}

g++ intbool.cpp -S génère asm code pour chacune des fonctions comme suit:

  • asm code pour f(int)

    __Z1fi:
       LFB0:
             pushl  %ebp
       LCFI0:
              movl  %esp, %ebp
       LCFI1:
              cmpl  $0, 8(%ebp)
              je    L2
              movl  $99, %eax
              jmp   L3
       L2:
              movl  $-99, %eax
       L3:
              leave
       LCFI2:
              ret
  • asm code pour g(bool)

    __Z1gb:
       LFB1:
              pushl %ebp
       LCFI3:
              movl  %esp, %ebp
       LCFI4:
              subl  $4, %esp
       LCFI5:
              movl  8(%ebp), %eax
              movb  %al, -4(%ebp)
              cmpb  $0, -4(%ebp)
              je    L5
              movl  $99, %eax
              jmp   L6
       L5:
              movl  $-99, %eax
       L6:
              leave
       LCFI6:
              ret

Étonnamment, g(bool) génère plus de asm instructions! Ça veut dire que if(bool) est peu plus lent que if(int)? J'ai l'habitude de penser que bool est particulièrement conçu pour être utilisé dans l'instruction conditionnelle telle que if, donc je m'attendais à g(bool) à générer moins de asm instructions, ce qui rend g(bool) plus efficace et rapide.

EDIT:

Je ne suis pas en utilisant toute option d'optimisation à partir de maintenant. Mais même en l'absence de cela, pourquoi est-il générer plus d'asm pour g(bool) est une question pour laquelle je suis à la recherche d'une réponse raisonnable. Je dois aussi vous dire que -O2 option d'optimisation génère exactement le même à l'asm. Mais ce n'est pas la question. La question est de savoir ce que j'ai demandé.


  • dépend si cmpb est plus rapide que cmpl
  • Il est également injuste de test à moins de les comparer avec raisonnable optimisations activées.
  • Je ne suis pas en utilisant toutes les options d'optimisation avec l'un d'eux. Mais même en l'absence de celui-ci, pourquoi ne génère plus d'asm pour g(bool) est une question pour laquelle je suis à la recherche d'une réponse raisonnable.
  • Si il n'y a aucun code entre accolades en suivant les instruction si, alors ... la réponse est.... ils sont les mêmes.
  • Je vous suggère d'utiliser -O3, mais assurez-vous que le compilateur n'est pas seulement en ligne et annuler votre code car il n'a aucun effet pour le moment. 😛
  • Je pense aussi que cela dépend de l'architecture et du compilateur
  • Voir le montage 😀
  • C'est ça le problème. Une version peut, pour les extérieurs, de la raison, de générer du code qui prend un couple de plus d'instructions lors de la compilation sans optimisations, mais une meilleure mesure de la valeur intrinsèque de la vitesse de l'essai de type int ou bool serait de comparer les deux compilé avec-O. Sans optimisations, vous êtes seulement de tester lequel est le plus directement traduit dans le compilateur de la représentation intermédiaire(s).
  • Aussi, est-il déplacer le bool sur l' %eax% s'inscrire car il n'est pas la taille de mot? En comparaison à l'int, qui est la taille de mot donc c'est un de moins optimisation; ce qui aurait sûrement été fait si l'optimisation des appartements ont été activés.
  • Pourquoi voudriez-vous aller à la peine de lire l'asm, mais pas seulement d'exécuter le programme et le calendrier de la suite? Le nombre de instructiosn n'est pas vraiment en dire beaucoup sur les performances. Vous avez besoin de prendre en compte non seulement l'instruction des longueurs, mais aussi les dépendances et les types d'instructions (certains d'entre eux sont décodés à l'aide de la plus lente de microcode chemin d'unités d'exécution vous demandent-ils, qu'est-ce que le temps de latence et le débit de l'instruction, est-il une branche? Un memmory accès?
  • pourquoi ne génère plus d'asm pour g(bool) est une question pour laquelle je suis à la recherche d'une réponse raisonnable" c'est pas ce Que dit le titre.
  • a) Pour toute raisonnable de travailler votre code sera plus jamais le faire, la différence de temps entre si (bool) ou si (int) doit être la plupart du temps inutiles. Écrire un code lisible. b) Écrire un environnement de test, d'où vous venez de passer dans les 2 alternatives d'une fonction, ce qui vous donne avec des données empiriques de 1 à 10 programme s'exécute avec 1000 à 1000000000 cas avec les différents paramètres du compilateur et des compilateurs différents - par la fabrication et de la version et de regarder votre micro-benchmarks vous-même.
  • inconnu,et @Malvolio: C'est évidemment; je ne suis pas le faire toutes ces, pour la production de code. Comme je l'ai déjà mentionné au début de mon post que "Donc, juste par curiosité, j'ai écrit ce programme". Donc ouais, c'est purement hypothétique.
  • C'est une question légitime. Ils sont soit équivalentes ou l'un est plus rapide. L'ASM a probablement été publié dans une tentative d'être utile ou de penser à voix haute, alors plutôt que de l'utiliser comme un moyen d'esquiver la question et de dire "il suffit d'écrire un code lisible", il suffit de répondre à la question ou STFU si vous ne savez pas ou n'avez pas quelque chose à en dire 😉 Ma contribution, c'est que la question est responsable, et "il suffit d'écrire un code lisible" n'est rien mais une esquive de la question.

InformationsquelleAutor Nawaz | 2011-04-23