Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > C/C++ программирование > Общие вопросы C/C++
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 26.12.2012, 19:26   #1
LynXzp
Пользователь
 
Аватар для LynXzp
 
Регистрация: 04.10.2012
Сообщений: 95
По умолчанию inline c gcc O3 медленее чем без inline

Стало жалко удалять, запостил, просто ради информации.
(как минимум в конкретно одном случае при компиляции с -O3 inline функция вызывается дольше чем -O3 без inline, но все равно быстрее всех -O2)

Попался на там что программа с inline функцией, которая вызывается только в 1 месте, выполняется медленнее чем без inline. Ассеблер я не знаю, но методом проверки оказалось что с опциями gcc -O0 inline все-же быстрее как и должно быть.

Подробности:

Кажется глупый вопрос если почитать просто теорию.
Но на практике получаю деградацию при использовании inline. (5% на всю программу, конечно не много, но нужно "ускорить" программу)

Функция объявленная inline вызывается только в одной строке кода. 100%.
Это функция сортировки. Поток один. Никаких других функций не вызывается (в конце вывод рез-та на консоль). Вставлял код функции в место вызова, эффект тот же то и с inline - медленнее.

Цитата:
not inline:
g++ -O3 s.cpp -o s
time ./s
14.82 (среднее из 10, максимальное отклонение 0.01) (в секундах)
inline:
15.15 (среднее из 10, максимальное отклонение 0.01)

g++ -O2
not inline:
15.74 (среднее из 10, максимальное отклонение 0.01)
inline:
15.60 (среднее из 10, максимальное отклонение 0.04)

g++ -O1
not inline:
16.87 (среднее из 10, максимальное отклонение 0.01, кроме первого 16.89)
inline:
16.11 (среднее из 10, максимальное отклонение 0.02)

g++ -O0
not inline:
36.53 (среднее из 10, максимальное отклонение 0.03)
inline:
36.04 (среднее из 10, максимальное отклонение 0.01, кроме первого запуска 36.39)
Судя по профилировщику prof функция вызывалась 2 млн раз.
Профилированием до этого не занимался, сейчас попробую добраться до построчного анализа. А ассемблер не знаю и подавно чтобы посмотреть в чем разница после компиляции. Код выполняет математические расчеты, ногу сломаешь пока поймешь, три дня писал, поэтому не выкладываю (ну еще по личным причинам), а сократить ... там все сломается, зациклится, ...
Пишу на чистом С, плюсы спилил.
LynXzp вне форума Ответить с цитированием
Старый 26.12.2012, 20:18   #2
rrrFer
Санитар
Старожил
 
Аватар для rrrFer
 
Регистрация: 04.10.2008
Сообщений: 2,618
По умолчанию

как бы в -O3 уже включен -finline-functions, поэтому если ваша функция может быть инлайн - то компилятор дописал инлайн за вас.

Ну а так, ходят слухи что -О3 дает кучу артефактов, я бы им пользоваться не стал.

Вот тебе полезная ссылка: http://gcc.gnu.org/onlinedocs/gcc-4....e-Options.html
rrrFer вне форума Ответить с цитированием
Старый 26.12.2012, 20:19   #3
rrrFer
Санитар
Старожил
 
Аватар для rrrFer
 
Регистрация: 04.10.2008
Сообщений: 2,618
По умолчанию

а вот цитата сразу (чтоб не искать)
Цитата:
-finline-functions
Integrate all simple functions into their callers. The compiler heuristically decides which functions are simple enough to be worth integrating in this way.

If all calls to a given function are integrated, and the function is declared static, then the function is normally not output as assembler code in its own right.

Enabled at level -O3.
rrrFer вне форума Ответить с цитированием
Старый 26.12.2012, 21:38   #4
LynXzp
Пользователь
 
Аватар для LynXzp
 
Регистрация: 04.10.2012
Сообщений: 95
По умолчанию

Тогда по идее должно быть все равно есть у меня inline или нету Но получается не так.

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

// kcachegrind неплох - сразу выдал что 60% времени у меня выполняется три строки (два вложенных цикла и условие с двумя умножениями)
Пишу на чистом С, плюсы спилил.
LynXzp вне форума Ответить с цитированием
Старый 27.12.2012, 20:54   #5
rrrFer
Санитар
Старожил
 
Аватар для rrrFer
 
Регистрация: 04.10.2008
Сообщений: 2,618
По умолчанию

Цитата:
Но опции не особо влияют, надо алгоритм пересматривать.
ну да, оптимизации алгоритм не меняют, сложность остается прежней (ну если очень жёстких ляпов нет типа мертвого кода сложностью О(N^5) ), а так...оно может "ускорить" программу в 2, 3, 4 ... 10, но не в N раз.
rrrFer вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
inline assembler qt lem Qt и кроссплатформенное программирование С/С++ 5 15.08.2011 12:08
inline оператор Selestis Общие вопросы C/C++ 26 01.07.2010 19:49
gcc inline assembler - обнуление переменной gvf Помощь студентам 1 13.06.2010 19:33
inline asm в gcc drRobert Assembler - Ассемблер (FASM, MASM, WASM, NASM, GoASM, Gas, RosAsm, HLA) и не рекомендуем TASM 0 23.08.2008 10:26
inline??? пыхта4ог Общие вопросы C/C++ 2 09.11.2007 17:54