Задать вопрос
vitali1995
@vitali1995

В каких случаях эффективнее дублирование кода вместо вызова функции?

Сейчас речь идёт не о скорости разработки и не о рисках сделать ошибку. Под эффективностью подразумеваю оптимальное соотношение скорости выполнения и размера исполняемого файла. К примеру, вместо вызова get/set методов в простых случаях эффективнее делать обращение к свойству - насколько мне известно, такую подстановку делают грамотные оптимизаторы. Можете ли вы с теоретической точки зрения обобщить правило ситуации, при которой эффективнее подставлять тело функции вместо её вызова?

Поправка к условию: функция может вызываться более чем в одном месте, рекурсия не требуется.
  • Вопрос задан
  • 712 просмотров
Подписаться 1 Оценить Комментировать
Решения вопроса 4
xmoonlight
@xmoonlight
https://sitecoder.blogspot.com
Если на данный момент функция в памяти не была определена (не была востребована) и использование логики работы кода этой функции планируется строго один раз, то разумнее использовать сразу само тело функции.
Ответ написан
@res2001
Developer, ex-admin
Всегда пишите функции.
Выставьте ключи оптимизации в компиляторе и отдайте этот вопрос на откуп компилятору - они справляются с этим на ура.
Вручную стоит "инлайнить" только какие-то однострочные функции, указав inline в описании функции. Но обычно компиляторы именно к этим функциям применяют подобную оптимизацию.
Ответ написан
@SolidMinus
Если вставлять inline функции, то бинарный код в размере очень сильно будет расти, но будет скорость выполнения будет также расти.

Поскольку если делать вызовы функции, то, например, в цикле это может в реал-тайм системах дать очень сильный эффект, т.к call инструкция процессора занимает гораздо больше тактов, нежели различные переходы, так как для вызова функции требуется передать ей и адрес возврата. После чего внутри функции следует выделение памяти на стеке под локальные переменные, выполнение нужного кода, освобождение памяти, и переход по адресу возрата. Не стоит забывать также про предшествующую вызову функции передачу параметров.

Поэтому это все можно упростить до такой степени, чтобы выполнялся лишь нужный код. Для этого лишь не надо плодить функции. Замечаешь разницу в количестве выполняемых этапов?

Если размер кода так критичен, но и нужна скорость, то можно выставить _fastcall перед определением функции, тогда вместо _cdecl функция будет вызываться без передачи параметров через стек, а передаваться внутри регистров. Это увеличит скорость вызова функций. Но не стоит злоупотреблять, т.к регистры используются для "быстрых вычислений", без доступа к памяти, и огромное количество _fastcall функций заставит компилятор перед вызовом функций постоянно сохранять состояние регистров, а потом восстанавливать.

Решается это все настройками оптимизатора на скорость или размер кода. При выставленной оптимизации по размеру кода спецификатор _inline игнорируется.
Ответ написан
@Fortop
Tech/Team lead
Всего два момента.

  • Размер кода
  • Критически важные ограничения по скорости выполнения (а не разработки)


Первое напрямую влияет на цену поддержки такого решения.
Второе поднимает или убирает лимиты на цену его поддержки.

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

Соотношение скорости выполнения и размера вторично - увы.

Раз пациент упорствует, то

@vitali1995, в вакууме разработчики не работают.

Вам нужен рерсурс по исследованиям. Вот там придумают и обоснуют.

Впрочем... Математику учили?

Вам нужно найти минимум от функции по time, или по size
f(sum(size), time)
Где sum(size) это сумма размеров всех функций в коде в комбинации подстановок
А time это время работы этого кода
Ответ написан
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы