Как же работает INLINE?

Вопросы программирования на Free Pascal, использования компилятора и утилит.

Модератор: Модераторы

Как же работает INLINE?

Сообщение AlexVinS » 30.07.2011 17:45:46

Имеем пакет fcl-stl из транка, там практически все (ну кроме деструкторов и конструкторов) заинлайнено. Использую в своем проекте и ожидаю что инлайн методы будут вставляться прямо в код откуда их вызывали, но они вместо этого появляются в ассемблерном листинге моего модуля отдельными процедурами :shock:

PS Никаких сообщений что inline невозможен не было -Si включено и для fcl-stl и для самого проекта.
Аватара пользователя
AlexVinS
новенький
 
Сообщения: 95
Зарегистрирован: 27.01.2009 01:18:01

Re: Как же работает INLINE?

Сообщение Sergei I. Gorelkin » 30.07.2011 18:13:02

Инлайн-процедуры всегда компилятся в том числе и обычным порядком и присутствуют в листинге - на случай если кому-то захочется получить их адрес или вызвать из модуля с отключенным инлайном. А вот что происходит в точке вызова - другой вопрос.
Аватара пользователя
Sergei I. Gorelkin
энтузиаст
 
Сообщения: 1407
Зарегистрирован: 24.07.2005 14:40:41
Откуда: Зеленоград

Re: Как же работает INLINE?

Сообщение AlexVinS » 30.07.2011 18:27:41

Да я именно про точку вызова - вызываются обычным "call". Но самое обидное что повторить на чистом примере сходу не получилось - инлайнятся нормально.
Аватара пользователя
AlexVinS
новенький
 
Сообщения: 95
Зарегистрирован: 27.01.2009 01:18:01

Re: Как же работает INLINE?

Сообщение Sergei I. Gorelkin » 30.07.2011 19:53:56

Думается мне, что оно с дженериками не сочетается... По отдельности и дженерики, и инлайн являются источниками самых трудноустранимых багов, а уж если их смешать...
Аватара пользователя
Sergei I. Gorelkin
энтузиаст
 
Сообщения: 1407
Зарегистрирован: 24.07.2005 14:40:41
Откуда: Зеленоград

Re: Как же работает INLINE?

Сообщение vada » 01.08.2011 15:03:41

А есть ли смысл пользоваться INLINE-ами?
Помнится в Turbo Pascal 3 на XT это было очень актуально.
CALL ... RET
очень большие (относительные) издержки были. Можно было чуть не в 2 раза сократить время счета использую INLINE
А сейчас с мегогерцами есть ли смысл блох ловить? Нет конечно понятно, если мы работаем с железом и нам нужно такты считать, но ведь тут на ASM надо.
В общем, на мой взгляд, не очень и надо тем более что CALL никуда не делся. Тем более что, вона, Горелкин про трудноловые баги говорит.
Аватара пользователя
vada
энтузиаст
 
Сообщения: 691
Зарегистрирован: 14.02.2006 13:43:17

Re: Как же работает INLINE?

Сообщение Sergei I. Gorelkin » 01.08.2011 15:59:57

Смысл есть, но по-хорошему этот вопрос должен решать компилятор, в зависимости от сложности, размера и частоты вызова процедуры. А сейчас как: если процедура меньше трех экранов - значит должна быть inline! А она при этом вызывает еще десяток таких же, и уровней этак на пять вниз. А потом - ой, екзешник на гигабайт получился, дайте что-нибудь чтобы его сжать...
Аватара пользователя
Sergei I. Gorelkin
энтузиаст
 
Сообщения: 1407
Зарегистрирован: 24.07.2005 14:40:41
Откуда: Зеленоград

Re: Как же работает INLINE?

Сообщение vada » 03.08.2011 15:41:02

Задействовал INLINE в описании некоторых частовызываемых функциях, получил сокращение времени счета на 20%
EXE-шник вырос на 20 кило.
Вполне. Вполне. Мне понравилось. :roll:
Аватара пользователя
vada
энтузиаст
 
Сообщения: 691
Зарегистрирован: 14.02.2006 13:43:17

Re: Как же работает INLINE?

Сообщение Kemet » 04.08.2011 08:30:17

Сходная проблема. Не так давно у нас, на смену уходящему поколению, пришли новые программеры. Ну и была поставлена перед ними задача переработать имеющийся код с учетом того, что грядет смена железа. Раньше все железо заказное было, а теперь, видимо, самое обычное, но современное и дешевое. Сам код был на сто раз перепахан, каждая строка выстрадана за годы работы, каждый модуль вручную оптимизирован. Но свежий взгляд всегда необходим, как глоток свежего воздуха. Через 3 месяца передают мне тестовую версию, компилирую, запускаю - в принципе не плохо, ужали размер процентов на 17, производительность возросла на 5-6%, а для нас это критично. Ну, думаю, сейчас еще подшаманим, сравним результаты с контрольной версией и на испытания. Есно всё это делалось на рабочей системе. Ставлю на компы из последней поставки и вижу, что неожиданно производительность просела более чем в 2 раза, по отношению к контрольной версии. Думаю, что за нах, на древней тестовой машине тоже самое выполняется быстрее. Открываю исходники и вижу - всё, что раньше было в виде вложенных процедур и дублировалось в разных модулях и даже в некоторых наследниках объектов, было вынесено наружу, сделано обычными методами, часть переписана на асме. Естественно размер уменьшился, а вот с производительностью лажа получилась. На старых заказных компах размер кэша больше и всё работает так, как и хотелось, а на новых происходит постоянная перезагрузка кэша, отсюда и пробуксовка. Так что вернули вложенные, инлайнить стали избирательно, отлаживая каждый модуль отдельно под конкретное железо.
Kemet
постоялец
 
Сообщения: 241
Зарегистрирован: 10.02.2010 19:28:32
Откуда: Временно оккупированная территория


Вернуться в Free Pascal Compiler

Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 6

Рейтинг@Mail.ru
cron