Есть ли какие-либо преимущества в производительности от использования else{} по сравнению с постоянным назначением переменной и изменением только при выполнении условия?

#performance #optimization

#Производительность #оптимизация

Вопрос:

Извините за плохое название.

Рассмотрим эти случаи:

Случай 1:

 a = true;
if (b)
{
    a = false
}
  

Случай 2:

 if (b)
{
    a = false
}
else
{
    a = true
}
  

Есть ли какая-либо разница в производительности в этих случаях?

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

1. Что-нибудь против случая 3: a = !b; ?

2. @Jon — Нет. Мой случай на самом деле был больше похож if (a || b) c=false; else c=true , но я уверен, что для этого случая тоже есть какое-то умное сокращение.

3. Ну, тривиально: c = !(a || b); или альтернативно c = !a amp;amp; !b;

4. Кажется, я понял. Если мои наблюдения верны, if (x << y amp;amp; 12 >>> 1 || a) c = false становится случаем 3: c = !(x << y amp;amp; 12 >>> 1 || a) . Спасибо @Jon.

5. Да — вы просто присваиваете значение, обратное значению выражения.

Ответ №1:

Вероятно, вам следует попытаться указать язык / компилятор / среду выполнения.

Короче говоря, нет: в большинстве случаев оптимизация компилятора устранит разницу.

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

1. Интересно. Я полагаю, что мой вопрос направлен к C #, поскольку именно там я столкнулся с этим случаем.

Ответ №2:

На самом деле не имеет значения, какая из них быстрее, потому что это микрооптимизации, которые вообще не влияют на время выполнения (за исключением некоторых ситуаций) и потому что «преждевременная оптимизация — корень всех зол». Вы должны приложить все свои усилия к оптимизации алгоритма, а не к этой резкости.
Как сказал @jalf, хороший компилятор скомпилирует их в точно такой же код, но если вы запускаете свой код на древнем процессоре, лучшим будет первый, потому что он требует на порядок меньше, чем другой.

Ответ №3:

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