2016-01-04 3 views
2

Я слышал, что компиляторы очень умны и знают, как оптимизировать операторы if/else.Что такое эксплуатационная стоимость тройного оператора

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

Позвольте мне пояснить, на основании того, что я слышал:

An если/другое должно пройти его состояние через трубопровод и ждать результата, прежде чем он может выполнить расчеты для результата.

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

Итак, что быстрее, тройники или если/еще?

+0

Это зависит от компилятора. Некоторые наивные, не оптимизирующие компиляторы могут, предположительно, использовать условные перемещения для тернар и ветвей для 'if/else', но любая разница между ними стирается во время более сложного преобразования SSA трансформатора. –

+1

По крайней мере, в C семантика '?:' Запрещает оценку невыделенной стороны так же, как 'if() else'. Компилятор может оценивать оба пути выполнения тогда и только тогда, когда он соответствует правилу as-if, т.е. е. компилятор может доказать, что дополнительное вычисление не вызывает каких-либо наблюдаемых побочных эффектов. Опять же, это точно такая же ситуация для '?:' И 'if() else'. – cmaster

+0

@IwillnotexistIdonotexist Наивный, не оптимизирующий компилятор не сможет доказать, что ему разрешено оценивать оба пути. Поэтому он должен скомпилировать '?:' Без условного перемещения. Только умные компиляторы могут доказать такие вещи и использовать условное движение здесь. – cmaster

ответ

4

Не будет разницы в производительности, тройной оператор - это просто синтаксический сахар.

От ISO/IEC 9899 C Стандарт (draft, page 90):

6.5.15 Условный оператор

(...)

семантике

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

+3

Просто, чтобы сделать резервную копию вашего ответа: http://stackoverflow.com/questions/3565368/ternary-operator-vs-if-else – azngunit81

+0

Из того, что говорят другие ответы, они одинаковы, если компилятор настроен на определенный уровень оптимизации. –

+2

@MagicalGordon Они одинаковы; Единственная деталь заключается в том, что один ('if (c) {a} else {b}') является оператором, а другой ('c? A: b') является выражением. В стандартных сценариях C описывается механика '?:' Точно как 'if/else': сначала выполняется условие, происходит точка последовательности, а затем вычисляются либо' a', либо 'b', но не оба. Компилятор _can_ оценивает оба, если это имеет тот же эффект, что и оценка только по правилу _as-if_; Но если оценка вызывает побочные эффекты, вы не можете этого сделать. –

Смежные вопросы