58 votes

équivalent probable / improbable pour MSVC

Le compilateur GCC prend en charge l'instruction __builtin_expect qui est utilisée pour définir les macros probables et improbables.

par exemple.

 #define likely(expr)    __builtin_expect((expr), !0)
#define unlikely(expr)  __builtin_expect((expr), 0)
 

Existe-t-il une déclaration équivalente pour le compilateur Microsoft Visual C, ou quelque chose d'équivalent?

20voto

Gene Points 51

Selon http://www.akkadia.org/drepper/cpumemory.pdf (page 57), il est toujours judicieux d'utiliser la prédiction de branche statique même si le processeur prédit correctement de manière dynamique. La raison en est que le cache L1i sera utilisé encore plus efficacement si la prédiction statique a été effectuée correctement.

17voto

DigitalRoss Points 80400

Je dis juste punt

La seule chose près, c'est le semi-intrinsèque __supposer(), mais ne l'utilisez pas, il est dangereux. Vous pouvez obtenir un code incorrect généré si l'expression s'avère être différent.

Vraiment, la raison de la gnu builtin est enveloppé dans une macro est de sorte que vous pouvez simplement se débarrasser de lui automatiquement si __GNUC__ n'est pas défini. Il n'y a pas de quoi le moins de bits nécessaires au sujet de ces macros et je parie que vous ne verrez pas le temps d'exécution de la différence.

Résumé

Juste se débarrasser de (null out) *likely sur la non-GNU. Vous n'aurez pas le manquer.

7voto

Xentrax Points 191

Selon "la Branche et de la Boucle de la Réorganisation afin de Prévenir Mispredicts" document d'Intel:

Afin de bien écrire votre code pour profiter de ces les règles, lors de l'écriture de if-else ou les instructions switch, case la plus des cas fréquents d'abord, et de travailler progressivement jusqu'à la moins fréquente.

Malheureusement, vous ne pouvez pas écrire quelque chose comme

#define if_unlikely(cond) if (!(cond)); else 

parce que MSVC optimiseur de VS10 ignore ces "hint".

Comme je préfère traiter avec des erreurs première dans mon code, j'ai l'impression d'écrire moins de code efficace. Heureusement, deuxième temps CPU rencontre le branche il s'agira d'utiliser les statistiques au lieu de statique de l'indice.

6voto

Michael Points 34110

__assume devrait être similaire.

Cependant, si vous voulez vraiment bien faire cela, vous devez utiliser l' optimisation guidée par profil plutôt que des conseils statiques.

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