Влияет ли вложение на эффективность? - PullRequest
4 голосов
/ 26 июля 2010

Рассмотрим такие языки, как Python или JavaScript, которые позволяют вкладывать функции следующим образом:

print(vector(a * b),(a * c),(b * c)))

или квартира, как это:

i = (a * b)
j = (a * c)
k = (b * c)
V = vector(i,j,k)
print(V)

Насколько другой формат влияет на производительность? Можно ли сделать правильные обобщения или они сильно различаются в зависимости от языка?

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

Ответы [ 2 ]

3 голосов
/ 26 июля 2010

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

Однако это ОЧЕНЬ небольшое количество машинных инструкций. Таким образом, в большинстве случаев вы можете легко сделать это для любого нетривиального размера, выбрав и реализовав более эффективный алгоритм.

Если вы действительно находитесь на BLAZING EDGE производительности (скорее всего, нет, если вы не работаете с драйверами устройств), тогда вы можете начать встраивать функции или переключаться на сборку.

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

Редактировать: если вы имеете в виду такие вещи, как анонимные функции, они вызывают снижение производительности, но, как всегда, измеряют сначала, оптимизируют вторым.

2 голосов
/ 27 июля 2010

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...