Interview question
: Lequel exécutera plus vite, if (flag==0)
ou if (0==flag)
? Pourquoi?
Réponses
Trop de publicités?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 -
flag
s'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.
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!
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
.