Какой хороший способ получить 0 или значение, зависящее от логического значения?

#c #bitwise-operators #mathematical-optimization

#c #побитовые операторы #математическая оптимизация

Вопрос:

В настоящее время я работаю над фрагментом кода, который довольно просто использует логическое значение, чтобы увидеть, перевернут ли экран по вертикали. Это делается с помощью :

 glOrtho(0.0f, _width, flip ? 0.0f : _height, flip ? _height : 0.0f, -1.0f, 1.0f);
  

Мне было интересно, есть ли более оптимизированный способ сделать это, например :

 glOrtho(0.0f, _width, !flip * _height, flip * _height, -1.0f, 1.0f);
  

Или сработала бы побитовая операция?

Спасибо за любой отзыв!

Комментарии:

1. Действительно ли оптимизация здесь вызывает беспокойство, учитывая, что переключение экрана — относительно редкое явление?

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

3. Поскольку эта функция вызывается очень редко (даже если вызывается один раз за кадр, это просто перевешивает слишком много вещей), это довольно необычное место для оптимизации. Я не знаю, так ли уж хорошо менять небольшой скачок на умножение с плавающей запятой. Но вы также могли бы переосмыслить _height как int и amp; it с помощью flip и -flip соответственно.

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

Ответ №1:

Вы уверены, что это узкое место в вашей программе?? Не оптимизируйте и не запутывайте свой код заранее только ради небольшого выигрыша.

Комментарии:

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

2. Я понимаю необходимость в лисибельности кода, я думаю, это был скорее гипотетический вопрос. Я думаю, что позже я проверю оптимизацию компилятора просто из интереса. Спасибо за быстрый ответ :).

Ответ №2:

В общем случае boolValue ? floatValue : 0.0f равно boolValue * floatValue

Комментарии:

1. Да, но одно быстрее другого?

2. @Oli: Возможно, учитывая, что трехзначный оператор по сути является условным выражением, но не настолько, чтобы меня это беспокоило.

3. @Oli: В общем, я считаю, что первый должен быть быстрее, поскольку он testb по сути, а второй включает математику с плавающей запятой.

4. @Vlad Lazarenko: Это очень зависит от реализации (не у всех процессоров есть testb ), но математика с плавающей запятой, как правило, дешевле, чем загрузка памяти.

5. Я думаю, все зависит, верно? Если этот материал уже находится в регистре, тестирование boolean и возврат float должно быть быстрее, чем FP math, даже с использованием MMX. Я говорю в основном о ядрах Intel. Это должно быть протестировано, чтобы знать наверняка. Но я не думаю, что это хуже, если только это не узкое место, в чем я сомневаюсь.