Подтвердить что ты не робот

Как намекнуть на оптимизатор компилятора Visual С++, что конкретная ветвь if-statement вряд ли будет выполнена?

У нас есть макрос для проверки ошибок, который выглядит следующим образом:

#define CheckCondition( x ) \
    if( x ) { \
    //okay, do nothing \
    } else { \
       CallFunctionThatThrowsException(); \
    }

и обычно условие должно быть true, и мы хотели бы, чтобы предсказание ветвления CPU всегда выбирало этот путь, и если это будет false, нам действительно не нужно ошибочное предсказание - выбрасывание исключения и массовое раскручивание штанов в любом случае обойдется в целое состояние.

В соответствии с предсказаниями предсказания процессора хардкора обработка предсказаний вперед и назад назад немного по-другому (что-то вроде обратного перехода всегда выполняется, и прямой прыжок никогда не выполняется), и компилятор может улучшить предсказание ветвления, генерируя код, который даст право намекает на предсказатель ветвления процессора.

gcc, кажется, имеет likely и unlikely подсказки. Есть ли что-то подобное в Visual С++? Может ли __assume keyword использоваться для этого?

4b9b3361

Ответ 1

Не в MSVC, к сожалению, в соответствии с их центром разработчиков.

Это очень расстраивает, потому что мы хотели бы использовать его в нескольких случаях, когда эквивалентный встроенный GCC спас нам критические несколько микросекунд во внутренних циклах, но самое близкое, что мы можем получить, - это заменить предложения if и else так что более вероятный случай находится в ветке, не связанной с переходом вперед.

Ответ 2

Включить Профилированная оптимизация. Компилятор не только максимизирует предсказание ветвления, но и полностью исключает холодный код. Этот канал 9 видео объясняет различные оптимизации.