Оптимизация сборки бинарников

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

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

Оптимизация сборки бинарников

Сообщение MageSlayer » 10.11.2008 12:57:37

Хай, уважаемый all.

Есть у меня несколько проектов на FreePascal, но в основном пишу на Delphi. /Это как дисклеймер ;).
Думаю, что это общая проблема для всех процедур сборки независимо от компилятора и остальных утилит.

В общем суть моей проблемы и ее исследования:
-Есть проект состоящий примерно из 1000 модулей.
-Модули раскиданы по примерно 30 папкам. Плюс стандартные папки исходников что из поставки, то есть еще порядка 30-40 папок.
-Чем дальше, тем больше начинаю замечать, что мой проект собирается все медленнее и медленнее. Под сборкой я имею ввиду не build, а make. То есть обычную сборку в процессе разработки. Сейчас уже make-сборка идет порядка 20сек. Это при том, что обычно изменяется всего 1-5 модулей.
-Процессор в процессе сборки не загружен (порядка 5-6%), винт молотит как ненормальный.
-Запустил filemon и увидел, что порядка 80% запросов к файловой системе - это просто поиск файла модуля и проверка его изменения. Всего таких "холостых" запросов на этот проект - порядка 30000.
-В общем, ощущение такое, что из этих 20сек большая часть времени тратится на поиск файлов по ветвистой иерархии ;)

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

Сейчас реализовал создание хард-линков на все файлы проекта в одной папке. "Холостых" запросов стало 6000. Субъективно сборка стала проходить в теже 5-6 раз быстрее.

В общем - к обсуждению.
Спасибо.
MageSlayer
постоялец
 
Сообщения: 216
Зарегистрирован: 07.09.2006 12:30:44

Re: Оптимизация сборки бинарников

Сообщение Sergei I. Gorelkin » 10.11.2008 18:07:43

Ну где-то примерно так оно и есть.
Кроме системного кэша, есть еще кэш в самом компиляторе: после некоторого количества посещений папки он вычитывает ее целиком. Фишка в том, что это "некоторое количество" настроено на линукс, чувствительный к регистру и поэтому ищущий каждый файл аж три раза.
Потом, есть ключ командной строки -Ur, который позволяет "отвязать" .ppu от исходников, т.е. компилятор не будет пытаться проверять обновления таких модулей. Его уместно применять к тем частям проекта, которые изменяются редко.
Файлы *.o, *.ppu совершенно точно можно свалить в одну папку.
Аватара пользователя
Sergei I. Gorelkin
энтузиаст
 
Сообщения: 1406
Зарегистрирован: 24.07.2005 14:40:41
Откуда: Зеленоград

Re: Оптимизация сборки бинарников

Сообщение MageSlayer » 10.11.2008 18:25:42

Ну где-то примерно так оно и есть.
Кроме системного кэша, есть еще кэш в самом компиляторе: после некоторого количества посещений папки он вычитывает ее целиком.

Это интересно. Delphi похоже, что не вычитывает.

Фишка в том, что это "некоторое количество" настроено на линукс, чувствительный к регистру и поэтому ищущий каждый файл аж три раза.


Каждый файл три раза? Это типа - нижний регистр имени файла, верхний и еще какой-то?

Потом, есть ключ командной строки -Ur, который позволяет "отвязать" .ppu от исходников, т.е. компилятор не будет пытаться проверять обновления таких модулей. Его уместно применять к тем частям проекта, которые изменяются редко.

И похоже, что этот ключик там не зря ;)

Файлы *.o, *.ppu совершенно точно можно свалить в одну папку

Это я так и сделал.
Вопрос в том - даст ли реально что-то, если свалить исходники (.pas) в одну папку. Субъективно - дело того стоит.

Спасибо за ответ.
MageSlayer
постоялец
 
Сообщения: 216
Зарегистрирован: 07.09.2006 12:30:44

Re: Оптимизация сборки бинарников

Сообщение Sergei I. Gorelkin » 10.11.2008 19:29:37

MageSlayer писал(а):Это интересно. Delphi похоже, что не вычитывает.

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

MageSlayer писал(а):Каждый файл три раза? Это типа - нижний регистр имени файла, верхний и еще какой-то?

И оригинальное написание, которое может сочетать буквы верхнего и нижнего регистра.

MageSlayer писал(а):И похоже, что этот ключик там не зря

Его изначальное предназначение несколько иное (для "коммерсантов" - позволяет распространять скомпилированные модули без исходников), но оказывается полезным и здесь.
Аватара пользователя
Sergei I. Gorelkin
энтузиаст
 
Сообщения: 1406
Зарегистрирован: 24.07.2005 14:40:41
Откуда: Зеленоград

Re: Оптимизация сборки бинарников

Сообщение MageSlayer » 10.11.2008 19:45:41

Дельфи это нафиг не нужно. В его поставке модулей на порядок (если не на два) меньше, чем в FPC, плюс они все свалены в одну папку.


Это - да. Только сторонних компонент от этого не становится меньше ;).
В общем ясно. Проблема есть, и это не мои домыслы.
Спасибо большое

Добавлено спустя 16 часов 22 минуты 26 секунд:
Кстати, решение с хард-линками на поверку решением можно назвать с натяжкой :( .

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

В Лазарусе тоже нет проверки при сохранении - ссылка переписывается или сам файл? (Лазаруса сейчас под рукой нет)
Если нет, то жаль - а счастье было так возможно ;)
MageSlayer
постоялец
 
Сообщения: 216
Зарегистрирован: 07.09.2006 12:30:44

Re: Оптимизация сборки бинарников

Сообщение bw » 11.11.2008 12:23:52

> Есть проект состоящий примерно из 1000 модулей.
При таком большом проекте стоит задуматься о разнесении его по нескольким динамическим библиотекам или нескольким приложениям. Вопрос о скорости компиляции снимается автоматически.

..bw
Аватара пользователя
bw
постоялец
 
Сообщения: 359
Зарегистрирован: 01.12.2005 11:36:23
Откуда: Усть-Илимск

Re: Оптимизация сборки бинарников

Сообщение MageSlayer » 11.11.2008 12:40:11

Есть проект состоящий примерно из 1000 модулей.
При таком большом проекте стоит задуматься о разнесении его по нескольким динамическим библиотекам


Это не большой проект, просто гуевый. Компонент/библиотек сторонних разных, порядка - 15. Более или менее нормальное решение для преобразования из объектных модулей в dll есть у фрипаскаля, AFAIK. Сам правда не тестил ;).
А это проект на дельфе. Преобразовывать чужие библиотеки в package занятие не очень приятное ;), да и вспухнет размер бинарного проекта на порядок.

Хочется какого-нибудь элегантного решения, вместо тупой, никому кроме тебя не видной работы. Как-то так...
MageSlayer
постоялец
 
Сообщения: 216
Зарегистрирован: 07.09.2006 12:30:44


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

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

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

Рейтинг@Mail.ru