Александр Михайлов
Александр Михайлов

Замедляет ли работу программы многократный вызов функции? Си



например если в ней цикл, станет ли код работать быстрее, если код переместить в основную программу?

ЗС
Зоя Семенова

Как будет вести себя конкретная программа в той или иной инкарнации, сделанной кодером заранее неясно. Компилятор с++/с от Интела выделяется тем, что приложения, на нём построенные работают заметнее быстрее, чем сделанные на др. компиляторах. Достигается это (в частности) за счёт увеличения кода. Считается, что компилятор способен оптимизировать код за юзера, но для допиливания в комплект ПО входит Intel Parallel Amplifier - тот самый профилировщик.

ЗЫ Пиши тест, как указано в 1м ответе

ДП
Денис Петроченков

Вызови функцию сто миллиардов раз и померь время с секундомером. О результатах отпиши

ВЗ
Валерий Закарлюка

Полагаю так.
Вызов функции сводится к помещению параметров в стек и вызову подпрограммы, в машинном коде. Взврат из подпрограммы обычно сводится к загрузке из стека адреса возврата. Средства отладки могут добавлять дополнительный код для отслеживания. Но они добавляются в этом случае, обычно, и к любому коду.
Всё, вобщем, сводится к относительной цене вызова. Если подпрограмма длинная, то время обеспечения вызова и возврата может быть крайне мало по отношению к длительности подпрограммы. А если подпрограмма короткая, то относительное увеличение может быть существенным.
Есть цикл внутри подпрограммы или нет - это к вызову не относится. А если в цикле делается вызов, и прохождений цикла много, то разница может быть большой. Поэтому циклы ообычно вычищают и оптимизируют по максимуму.
В компиляторе может быть функция инлайн подстановки тела функции. Функция может быть объявлена, как inline. Тогда она оформляется, как обычная функция, а при формировании кода её тело может подстанавливаться прямо в программу, линейно, без перехода. Так можно совмещать удобство оформления программы и эффективность выполнения.
Есть ещё одно обстоятельство, которое может замедлять подпрограммы. Подпрограмма работает обычно с локальными переменными. Они передаются по значению и по ссылке. При этом значения переменных или ссылки на них обычно помещаются в стеке. И обращение к ним может происходить через адресный сегмент стека. Это несколько своеобразный способ, который обычно дольше по времени, чем обычное обращение, потому что при формировании адреса в стеке используется дополнительный уровень косвенности обращения. А это обычно - потеря времени на каждое обращение. Кроме того, при передаче переменной по ссылке, когда передаётся не она сама, а её адрес, добавляется ещё уровень косвенности при обращении к переменной. Это тоже время, на каждое обращение. Вот обращения к переменным, локальным, может приводить к большим потерям времени. Тут, надо, наверное, смотреть на фактический машинный код, насколько длиннее получается. Частичным решеним проблемы может быть использованием глобальных переменных.

Алексей
Алексей

Включи максимальную оптимизацию по скорости и отпрофилируй. Что гадать-то.
Вызов ф-ции не обязан работать через стек.

Стандарты C и C++ позволяют дать лишь нижнюю оценку скорости дать в каждом конкретном случае, да и то в терминах O(чего-то там) . Все остальное - на усмотрение компилятора.

PS. А вообще есть такая "парадигма" при написании кода - premature optimization. Смысл в том, что пока не начнет тормозить, нечего туда лезть оптимизировать.
Бывают определенные исключения из правила - напр. , при написании софта, который в боевых условиях будет работать с большими объемами данных и/или с высокой нагрузкой со стороны клиентской части, а в тестовых условиях создать боевые уловия тяжело. Но это отдельная тема.

Похожие вопросы
Программирование на Си! Работа с процедурами и функциями.
СИ. Работа с файлами. как подправить программу?
Помогите написать программу на Си с использованием рекурсивной функции
Fasm, вызов WinAPI функций
Помогите пожалуста написать программу на Си++ с использованием шаблонов функций
помогите написать программу на Си++..с использованием шаблонов функции
Вызов функции из exe?
разница между функциями в Си и функциями (и процедурами) в Паскаль
программа на си++
Программа на си++