équivalent probable / peu probable pour MSVC

Le compilateur GCC prend en charge l’instruction __builtin_expect utilisée pour définir des 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?

Je dis juste punt

Il n’y a rien de tel. Il y a __assume () , mais ne l’utilisez pas, c’est un autre type de directive d’optimisation.

Vraiment, la raison pour laquelle gnu est intégré dans une macro est que vous pouvez vous en débarrasser automatiquement si __GNUC__ n’est pas défini. Il n’y a rien de moins nécessaire sur ces macros et je parie que vous ne remarquerez pas la différence de temps d’exécution.

Résumé

Débarrassez-vous de (null out) *likely sur non-GNU. Vous ne le manquerez pas.

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

__assume devrait être similaire.

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

Selon la réorganisation de la twig et de la boucle pour empêcher les fautes de frappe des documents d’Intel:

Afin d’écrire efficacement votre code pour tirer parti de ces règles, lorsque vous écrivez des instructions if-else ou switch, vérifiez d’abord les cas les plus courants et travaillez progressivement jusqu’au niveau le moins courant.

Malheureusement, vous ne pouvez pas écrire quelque chose comme

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

car l’optimiseur MSVC à partir de VS10 ignore cette “indication”.

Comme je préfère traiter les erreurs d’abord dans mon code, il semble que j’écrive du code moins efficace. Heureusement, la deuxième fois que le processeur rencontre la twig, il utilisera ses statistiques au lieu d’un indice statique.

La norme C ++ 20 inclura les atsortingbuts de prédiction de twig [[likely]] et [[unlikely]] .

La dernière révision de la proposition d’atsortingbut est disponible sur http://wg21.link/p0479

La proposition d’atsortingbut d’origine peut être trouvée sur http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2016/p0479r0.html

Les programmeurs devraient préférer PGO. Les atsortingbuts peuvent facilement réduire les performances s’ils sont appliqués de manière incorrecte ou s’ils deviennent ultérieurement incorrects lorsque le programme change.