#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:
Обычно это зависит от того, какой компилятор вы используете и какие параметры передаются ему. Определенно возможно оптимизировать такие условия с помощью анализа потока данных (т. е. анализа переменных в реальном времени), который способны выполнять большинство современных компиляторов.