probable/peu probable équivalent de MSVC
Compilateur GCC supporte __builtin_attendent déclaration qui est utilisé pour définir probable et improbable macros.
par exemple.
#define likely(expr) (__builtin_expect(!!(expr), 1))
#define unlikely(expr) (__builtin_expect(!!(expr), 0))
Est-il une mention équivalente pour Microsoft Visual C compilateur, ou quelque chose d'équivalent ?
- Voter pour ajouter cette fonctionnalité sur les VS commentaires site!
- Notez que Microsoft a déclaré qu'ils n'aiment pas ce genre d'optimisations ici et ici. Il semble peu probable (no pun intended) que cela va être ajouté dans le futur.
We want people to use profile guided optimizations instead of annotating their code by hand. See
ce postfor more info. Profile counts don't lie (or rather, they lie much less than users do).
- Alors, où peut-on voter pour ajouter cet incroyable fonctionnalité pour VS?
- voir aussi
BOOST_LIKELY
etBOOST_UNLIKELY
- tous les liens sont morts. Une autre réponse: *L'argument de la non-exécution de cette fonction est qu'elle est non-standard. MSVC est poussée à mettre en œuvre les normes de fonctions, de ne pas prolonger la langue dans les moyens qui sont incompatibles avec d'autres compilateurs. (Nous avons fait beaucoup trop dans notre passé.) Il y a une proposition de normes d'introduire un tel attribut. Quand il est normalisé, nous allons la mettre en œuvre: open-std.org/jtc1/sc22/wg21/docs/papers/2017/p0627r0.pdf
- malheureusement il n'y a pas d'archive, je sais de pour connect pages. Sur la page de connexion d'un employé de Microsoft a déclaré que la machine a fait un meilleur travail d'optimisation, je suppose que nous sommes en train de légèrement différent maintenant ("il n'est pas conforme aux normes").
- Voir aussi: cette méta post lors de la connexion des liens.
Vous devez vous connecter pour publier un commentaire.
Je dis juste punt
Il n'y a rien de tel. Il est __supposer(), mais ne l'utilisez pas, c'est un genre différent de l'optimiseur de la directive.
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.Sommaire
Simplement se débarrasser de (null out)
*likely
sur la non-GNU. Vous n'aurez pas le manquer.safeCall(mDevice.doit())
, monsafeCall
est bordée qui augmente les performances, mais seulement quand j'ai le probable/peu probable de la branche. Je veux dire que ces macros peuvent être utiles.unlikely
intrinsèque. Sans PGO (qui est un pain PITA) le stupide MSVC presque toujours commandes instructions de la mauvaise façon._assume
comme "fermer" dans ce contexte est un peu malchanceux texte, car il n'est pas même à distance similaire. L'ignorant lecteur peut interpréter "pouvez obtenir un code incorrect", à tort. Son meanining est équivalent à__builtin_unreachable
. De l'utiliser pour la branche allusion n'est pas seulement dangereux, c'est par tous les moyens, et toujours, est incorrect._assume(cond)
est sémantiquement équivalent en grande partie àif (!(cond)) __builtin_unreachable();
dans GCC. Ce qui signifie en l'utilisant comme une ramification de la pointe permet au compilateur de supprimer l'ensemble de la "inaccessible" de la branche, et la condition bien s'il n'a pas d'effets secondaires.__builtin_expect
: stackoverflow.com/a/35940041/995714 stackoverflow.com/a/31133787/995714Selon http://www.akkadia.org/drepper/cpumemory.pdf (page 57), il a encore un sens pour utilisation statique de la direction de la prévision, même si le CPU prédit correctement de façon dynamique.
La raison en est que L1i cache sera utilisé de manière encore plus efficace si statique de la prédiction a été fait droit.
C++20 standard comprendra
[[likely]]
et[[unlikely]]
direction de la prévision attributs.La dernière révision de l'attribut de la proposition peut être trouvé à partir de http://wg21.link/p0479
L'origine de l'attribut de la proposition peut être trouvé à partir de http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2016/p0479r0.html
Les programmeurs doivent préfèrent PGO. Les attributs peuvent facilement réduire les performances si elle est appliquée de manière incorrecte ou plus tard, ils deviennent incorrectes lorsque des changements de programme.
__builtin_expect
(akalikely
/ " peu probable)? L'argument de la non-exécution de cette fonction est qu'elle est non-standard. MSVC est poussée à mettre en œuvre les normes de fonctions, de ne pas prolonger la langue dans les moyens qui sont incompatibles avec d'autres compilateurs. (Nous avons fait beaucoup trop dans notre passé.) Il y a une proposition de normes d'introduire un tel attribut. Quand il est normalisé, nous allons la mettre en œuvre: open-std.org/jtc1/sc22/wg21/docs/papers/2017/p0627r0.pdf__supposer devrait être similaire.Toutefois, si vous voulez le faire vraiment bien, vous devez utiliser Profil Guidée De L'Optimisation plutôt que statique conseils.
Selon Direction générale et de la Boucle de la Réorganisation afin de Prévenir Mispredicts document à partir d'Intel:
Malheureusement vous ne pouvez pas écrire quelque chose comme
parce que MSVC optimiseur de VS10 ignore ces "hint".
Que 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 soupçon.