вероятный / маловероятный эквивалент для MSVC - PullRequest
46 голосов
/ 17 сентября 2009

Компилятор GCC поддерживает оператор __builtin_expect, который используется для определения вероятных и маловероятных макросов.

например.

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

Есть ли эквивалентное утверждение для компилятора Microsoft Visual C или что-то подобное?

Ответы [ 5 ]

21 голосов
/ 28 сентября 2012

Согласно http://www.akkadia.org/drepper/cpumemory.pdf (стр. 57), все еще имеет смысл использовать статическое прогнозирование ветвления, даже если процессор прогнозирует правильно динамически. Причина в том, что кэш L1i будет использоваться еще эффективнее, если статическое предсказание выполнено правильно.

19 голосов
/ 17 сентября 2009

Я говорю просто пунт

Нет ничего подобного. Существует __ accept () , но не используйте его, это директива оптимизатора другого рода.

Действительно, встроенная в макрос функция gnu заключается в том, что вы можете просто избавиться от нее автоматически, если __GNUC__ не определено. В этих макросах нет ничего необходимого, и я уверен, что вы не заметите разницу во времени выполнения.

Резюме

Просто избавьтесь от (null out) *likely в не-GNU. Вы не пропустите это.

11 голосов
/ 24 июня 2018
Стандарт

C ++ 20 будет включать [[likely]] и [[unlikely]] атрибуты прогнозирования ветвления.

Самую последнюю версию предложения по атрибутам можно найти по http://wg21.link/p0479

Исходное предложение атрибута можно найти по адресу http://www.open -std.org / jtc1 / sc22 / wg21 / docs / documents / 2016 / p0479r0.html

Программисты должны предпочесть PGO. Атрибуты могут легко снизить производительность, если они применяются неправильно или позже становятся неправильными при изменении программы.

6 голосов
/ 02 июля 2012

Согласно Реорганизация ветвей и циклов для предотвращения ошибочных прогнозов Документ от Intel:

Чтобы эффективно написать свой код, чтобы воспользоваться этими правила, при написании if-else или switch операторов, отметьте наиболее сначала распространенные случаи и постепенно снижающиеся до минимальных.

К сожалению, вы не можете написать что-то вроде

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

потому что оптимизатор MSVC с VS10 игнорирует такую ​​«подсказку».

Поскольку я предпочитаю сначала иметь дело с ошибками в своем коде, мне кажется, что я пишу менее эффективный код. К счастью, во второй раз, когда ЦП встречает ветку, он использует свою статистику вместо статической подсказки.

6 голосов
/ 17 сентября 2009

__ предположим, что должно быть похоже.

Однако, если вы хотите сделать это действительно хорошо, вы должны использовать Оптимизация профиля по профилю , а не статические подсказки.

...