#c #performance
#c #Производительность
Вопрос:
У меня есть этот код
void test()
{
If (condition)
{
doSomthing();
}
}
test();
doSomethingMore();
Есть ли какой-либо эффект производительности при изменении его на:
void test()
{
If (!condition)
{
return;
}else
doSomthing();
}
}
test();
doSomethingMore();
Почему??
Комментарии:
1. Ответ на все вопросы о производительности здесь сводится к «Реализовать оба и измерить».
2. Предполагается, что это код на C ?
3. Для меня похоже на PHP. Даже тогда это не работает.
4. Вы измерили производительность обоих? Как у вас получилось это скомпилировать? Это не похоже на C .
5. @Paul: для меня это больше похоже на псевдокод…
Ответ №1:
Вы действительно задаете неправильный вопрос. Производительность здесь совершенно не важна. Любой оптимизирующий компилятор сделает это абсолютно незначимым, вероятно, создавая точно одинаковый двоичный файл для обоих стилей.
Нет, на самом деле реальный вопрос в том, какой фрагмент кода более читабелен. Ваши коллеги-люди — это те, кому позже придется прочитать и понять ваш код. И, если вам особенно не повезет, одним из тех людей, которым позже придется читать и понимать ваш код, может быть даже вы. Таким образом, гораздо важнее писать код, который логически структурирован и легко читаем, чем беспокоиться о микрооптимизациях, подобных этой. Пусть компилятор с этим справится.
Итак, что более читаемо? Безусловно, первое. Если condition
значение true, то вы собираетесь вызвать doSomething()
функцию. Намного понятнее.
В общем, if
инструкции должны оценивать условия с положительным именем. В большинстве случаев вам следует стараться избегать знака !
, поскольку его легко пропустить при сканировании кода и потенциально он может заставить ваш код считываться как дважды отрицательный. Вам также обычно следует избегать наличия нескольких точек выхода из функций (т. Е. return
инструкции). Вы должны быть в состоянии прочитать функцию сверху вниз и точно увидеть, что она делает, без необходимости перемещаться. Второй фрагмент кода нарушает оба этих правила и мало что еще может помочь оправдать предпочтение его первому.
Комментарии:
1. @LightWing — Особенно плохо сочетается
if(!condition)
сelse
, поскольку тогда у вас есть двойное отрицание для этой части.
Ответ №2:
Для любого современного компилятора крайне маловероятно, что небольшие изменения, подобные этому, будут иметь какое-либо значение. Оптимизатор уже выполняет множество мелких оптимизаций (и несколько крупных).
В вашем конкретном примере определенно не будет никакой разницы даже с полностью неоптимизированным компилятором. Все, что вы сделали, это добавили дополнительную явную инструкцию «return», которая иногда будет выполняться вместо подразумеваемого возврата в конце функции.
Ваш код может в конечном итоге стать на четыре байта больше, но время выполнения будет идентичным.