Будет ли ускоряться inline void a (строка b) {cout << b; } - PullRequest
1 голос
/ 02 июля 2011

Для назначения мы должны написать два метода для обработки выходных данных. Один для вывода строк и один для целых чисел.

Обычно у нас есть два метода, вызывающих другой метод:

void TheClass::displayString(string str){ cout << str; }
void TheClass::displayNumber(int n) { cout << n; }

Будет ускорить процесс, сэкономив некоторые издержки, не вызывая еще одну функцию или это создаст больше в отношении пространств имен и тому подобного для cout?

inline void TheClass::displayString(string str) { cout << str; }
inline void TheClass::displayNumber(int n) { cout << n; }

Ответы [ 7 ]

13 голосов
/ 02 июля 2011

Пространства имен не имеют к этому никакого отношения.

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

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

2 голосов
/ 02 июля 2011

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

Я использовал inline функции в программировании opengl. Программы OpenGL - это бесконечные циклы.Чтобы сделать цикл максимально быстрым, вам нужно очень эффективно программировать, чтобы он оставался отзывчивым на пользователя и плавно создавал изображение. Я полагал, что объявление некоторых функций inline сделает программу более быстрой и плавной.

В конце концов, не ожидайте значительного повышения производительности от этой техники, вероятно, только на 1-2% меньше времени выполнения в крайних случаях.

1 голос
/ 02 июля 2011

С этими двумя функциями вы, вероятно, не увидите заметного различия, независимо от того, встроен ли компилятор в функции или нет.

Причина в том, что вставка потока (<<) довольно медленная.Гораздо медленнее, чем один простой (не встроенный) вызов функции.

И, как уже отмечали другие, вы действительно должны привыкнуть к передаче строк по ссылке на const (и любым другим объектам, которые не являютсядействительно очень дешево копировать).

В некоторых ситуациях предпочтительнее передавать по значению, даже (или особенно), если копия дорогая (например, при реализации operator = с копированием и обменом).Но они редки, и пока вы сами не можете решить, что уместно, вам гораздо лучше всегда проходить по ссылке на const, чем всегда по значению.

1 голос
/ 02 июля 2011

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

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

0 голосов
/ 02 июля 2011

Softnux, почему бы вам просто не создать тест?Создайте цикл for с миллионом повторений и посмотрите, сколько времени потребуется для каждого из вариантов.Затем выполните тестирование отдельно для сборок Debug и Release.Современные компиляторы должны выяснить, когда встраивание или развертывание цикла являются лучшим вариантом.

Правка: попробуйте использовать поток строк.Узким местом здесь будет вывод на консоль, а не сам вызов функции.

0 голосов
/ 02 июля 2011

Один способ оптимизировать, чтобы иметь константную ссылку:

void TheClass::displayString(cosnt string& str){ cout << str; }
0 голосов
/ 02 июля 2011

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

Простой первый шаг к ускорению вашего кода - сделать строковый параметр константной строкой & вместо этого.Таким образом, вы не будете копировать строку.Более сложным вторым шагом было бы использование API вывода C вместо потоков C ++.По моему опыту, C API был намного быстрее, и это резервное копирование здесь и здесь .Однако я не рекомендую переходить на C API, если вы не уверены, что вам действительно нужна производительность на основе профилирования.

...