113 votes

Lequel sera exécuté plus rapidement, si (drapeau == 0) ou si (0 == drapeau)?

Interview question : Lequel exécutera plus vite, if (flag==0) ou if (0==flag) ? Pourquoi?

237voto

Matthieu M. Points 101624

Je n'ai pas vu de réponse correcte (mais il y a déjà quelques) mise en garde: Nawaz n'a point défini par l'utilisateur piège. Et je regrette mon hâtivement jeté upvote sur "la question la plus stupide", car il semble que beaucoup ne l'obtiennent pas droit et il donne de la place pour une belle discussion sur l'optimisation du compilateur :)

La réponse est:

Qu'est - flags'type?

Dans le cas où l' flag est en fait un type défini par l'utilisateur. Ensuite, cela dépend de la surcharge d' operator== est sélectionné. Bien sûr, il peut sembler stupide qu'ils ne seraient pas symétrique, mais il est certainement permis, et j'ai vu d'autres abus déjà.

Si flag est un construit dans, les deux devraient prendre la même vitesse.

À partir de l' article de Wikipédia sur x86, je parierais pour un Jxx instructions pour l' if déclaration: peut-être un JNZ (Saut si Pas de Zéro) ou l'équivalent.

J'avais doute que le compilateur manque une optimisation évidente, même avec les optimisations éteint. C'est le type de choses pour lesquelles Judas Optimisation est conçu pour.

EDIT: surgirent de nouveau, donc, nous allons ajouter un peu de montage (LLVM 2.7 IR)

int regular(int c) {
  if (c == 0) { return 0; }
  return 1;
}

int yoda(int c) {
  if (0 == c) { return 0; }
  return 1;
}

define i32 @regular(i32 %c) nounwind readnone {
entry:
  %not. = icmp ne i32 %c, 0                       ; <i1> [#uses=1]
  %.0 = zext i1 %not. to i32                      ; <i32> [#uses=1]
  ret i32 %.0
}

define i32 @yoda(i32 %c) nounwind readnone {
entry:
  %not. = icmp ne i32 %c, 0                       ; <i1> [#uses=1]
  %.0 = zext i1 %not. to i32                      ; <i32> [#uses=1]
  ret i32 %.0
}

Même si on ne sait pas comment lire l'IR, je pense qu'il est auto-explicatif.

56voto

Nawaz Points 148870

Il n'y aura pas de différence dans vos versions.

Je suis en supposant que l' type de drapeau n'est pas de type défini par l'utilisateur, mais c'est plutôt certains type intégré. Enum est une exception!. Vous pouvez traiter l'énumération que si c'est intégré. En fait, il' les valeurs sont l'un des types intégrés!

Dans le cas, si c'est un type défini par l'utilisateur (à l'exception de enum), alors la réponse dépend entièrement de la façon dont vous avez surchargé l'opérateur == . Notez que si vous avez une surcharge == par la définition des deux fonctions, une pour chacun de vos versions!

56voto

skc Points 531

Même code pour amd64 avec GCC 4.1.2 :

27voto

Linus Kleen Points 15925

Il n’y a absolument aucune différence.

Vous pourriez gagner des points pour répondre à cette question de l’entrevue en se référant à l’élimination des fautes de frappe cession/comparaison, quoique :

S’il est vrai, que, par exemple, un compilateur C avertir en cas de l’ancien ( ), il n’y a pas de tels avertissements en PHP, Perl ou Javascript ou .

16voto

Jon Points 194296

Il n’y aura absolument aucune différence en terme de vitesse. Pourquoi devrait-il y avoir ?

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X