2015-08-18 4 views
4

мне было интересно, если есть какие-либо преимущество в скорости, чтобы делать случай В против случая А (или наоборот) в следующем:C Скорость ++ и логический поток

bool test1(){ 
// Check something, return true/false 
} 
bool test2(){ 
// Check something, return true/false 
} 

Case А

if(test1() && test2()){ 
    //execute XYZ 
} 

Случай B

if(test1()){ 
    if(test2()){ 
     //execute XYZ 
    } 
} 

Я имею в виду, если подпрограммы, участвующие в test1() и test2(), занимают некоторое время, чтобы выполнить, тогда интуитивно некоторые люди могут подумать, что Case B может работать быстрее, так как test2() будет выполняться только в том случае, если тест 1 является истинным или является достаточно умным компилятором для определения в логическом последовательность случая А, что, как только test1(...) не удастся, тогда не нужно проверять test2(...)?

Возможно выше эквивалентны, может кто-то дайте мне знать ...

ответ

4

Они эквивалентны, если test1 возвращает ложь, test2 не будет выполняться в обоих случаях.

9

is the compiler smart enough to determine да это, это называется Short-circuit evaluation, и работает с &&, || и ? операторов (если не перегружать их), как описано в стандарте в пунктах 5.14, 5.15 и 5.16.

+2

Спасибо, поэтому, если вы знаете, что 'test2()' будет возвращать ложь чаще, чем 'test1()', более выгодно писать 'test2() && test1()' over 'test1() && test2 () '? –

+1

В равной степени, если test2 занимает намного больше времени для выполнения, вы можете сначала запустить test1. – camelCase

+0

Комментарий, который я сделал в другом месте: более полный ответ должен содержать утверждение «... if' operator && 'не был перегружен.Если это так, то логический оператор обрабатывается больше как нормальная функция, и оба выражения будут оценены. » –

1

В обоих случаях тест 2 не будет выполнен, если тест 1 является ложным. Они одинаковы в этом отношении.

Корпус А является предпочтительным для случая В для удобства чтения. Вы можете видеть, что в одной строке оба должны быть истинными, а при заказе может видеть, что сначала проверяется тест 1.

1

В java, например, он может избежать некоторых тестов, если ответ уже на руках. У меня нет времени проверить этот случай. Но вы можете легко протестировать, сделать очень медленный рот на test2() и дать ответ antecipate на test1(). Затем, если ответ вернется быстро. C++ работает как Java.

В вашем примере у вас есть ответ antecipate, если возвращаемые значения test1() являются ложными. Другим способом является test2().

Если вы можете подождать, я провешу сегодня этот случай.

-2

Case A работать быстрее, это две причины.

1.It будет short-circuit evaluate для &&, || логических операторов и т.д. так Case A может стоить меньше времени, чем Case B

2. if заявления будет перевести на jmp ассемблер, стоит больше времени для преобразования приложений. поэтому Case B будет стоить больше времени, чем Case A.

+1

Вы уверены, что какой-либо оптимизатор, достойный имени, будет производить разные результаты для тех двух? – Angew