Логические операторы и ошибка прогнозирования ветвления

Рассмотрим следующие циклы:

while((expressionA) & (expressionB)){
// do something
}
while((expressionA) && (expressionB)){
// do something
}

где expressionA а также expressionB выражения типа bool а также expressionB не имеет побочных эффектов. В этих условиях два случая как будто-эквивалент (верно?).

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

С современным компилятором (таким как текущий GCC), могут ли когда-либо быть условия, при которых & версия дает существенный прирост производительности по сравнению с && версия?


Мое предположение нет, потому что:

  • Если expressionB достаточно дешевый, компилятор распознает это и избегает создания короткозамкнутой ветви.
  • Если expressionB достаточно дорого, компилятор создаст короткое замыкание, потому что:
    • если вероятность expressionA не близко к 1.0, мы получаем существенный средний выигрыш в производительности от короткого замыкания.
    • если вероятность expressionA близко к 1,0, мы не будем платить много, потому что предсказание ветвления будет иметь тенденцию к успеху.

6

Решение

Задача ещё не решена.

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]