Увеличить скорость программы, избегая функций? (C ++) - PullRequest
2 голосов
/ 04 марта 2012

Когда дело доходит до процедурного программирования, функциональная декомпозиция идеальна для поддержки сложного кода.Однако функции стоят дорого - добавление в стек вызовов, передача параметров, сохранение адресов возврата.все это требует дополнительного времени!Когда скорость имеет решающее значение, как я могу получить лучшее из обоих миров?Мне нужна сильно разложенная программа без каких-либо необходимых накладных расходов, вызываемых вызовами функций.Я знаком с ключевым словом: «inline», но, похоже, это всего лишь предложение для компилятора, и при неправильном использовании программистом это приведет к еще более медленной программе.Я использую g ++, поэтому флаг -03 оптимизирует мои функции, которые вызывают функции, которые вызывают функции ... Я просто хотел знать, допустимы ли мои опасения и существуют ли какие-либо методы для борьбы с этой проблемой.

Ответы [ 3 ]

4 голосов
/ 04 марта 2012

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

Затем вы можете немного предвидеть, какие функции вы хотите встроить, используя ключевое слово inline. Компилятор, как правило, достаточно умен, чтобы знать, что встроить, а что нет (он может встроить функции, которые вы забыли, и может не включать некоторые из упомянутых вами, если он считает, что это не поможет).

Если (действительно) вы все еще хотите улучшить производительность при вызове функций и хотите принудительно использовать встраивание, некоторые компиляторы позволяют вам это сделать (см. Этот вопрос ). Учтите, что массовое встраивание может фактически снизить производительность: ваш код будет использовать много памяти, и вы можете получить больше кеш-ошибок в коде, чем раньше (что не очень хорошо).

1 голос
/ 04 марта 2012

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

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

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

0 голосов
/ 04 марта 2012

Я очень сомневаюсь, что скорость - это главное, но я бы предложил использовать макросы препроцессора.

Например

#define max(a,b) ( a > b ? a : b )

Это может показаться мне очевидным, но я не считаю себя ожидаемым в C ++, поэтому, возможно, я неправильно понял вопрос.

...