LINUX.ORG.RU

Как ускорить сборку?


0

1

Каким образом можно ускорить сборку программы?

Программа на размером около 2000 строк, но использует кучу библиотек boost, большинство из которых header-only.

Использую gcc (в случае надобности могу сменить его на любой другой).

Deleted

К вышеизложенному могу лишь порекомендовать пересмотреть граф зависимостей исходников. Ну и за чашкой кофе время пролетит незаметно.

KblCb ★★★★★
()

PIMPL, время сборки с нуля не уменьшит, но все равно полезно

yoghurt ★★★★★
()
Ответ на: комментарий от anon_666

gcc -pipe -j<число ядер процессора+1>

Что делает -pipe? У мну одно ядро процессора.

distcc + ccache

Что это?

Ну и очевидно, что с -O0 сборка пройдёт быстрее.

А по дефолту разве не так?

Deleted
()
Ответ на: комментарий от Dead

Интересно. Хоть и куча ограничений.

Т.е. все хидеры boost и все мои неизменяющиеся хидеры проинклудить в отдельный файл, сделать его precompiled header и проинклудить в нужные файлы первой строкой?

Deleted
()
Ответ на: комментарий от Deleted

Т.е. все хидеры boost и все мои неизменяющиеся хидеры проинклудить в отдельный файл, сделать его precompiled header и проинклудить в нужные файлы первой строкой?

Свои хидеры наверное не стоит, они же погоды не делают. А в остальном все вроде так.

gizzka ★★
()

>boost
еще бы оно не тормозило

xorik ★★★★★
()

прекомпиленные заголовки буста (lambda, mpl и прочие) сами по себе по личному опыту сборку почти не ускоряют. прекомпилировать надо уже что-нибудь инстанциированноое (напр. extern template)

pimpl; меньше юзать бустовые шаблоны в заголовках, больше в реализации

anonymous
()
Ответ на: комментарий от anonymous

прекомпиленные заголовки буста (lambda, mpl и прочие) сами по себе по личному опыту сборку почти не ускоряют.

Мну использует asio, serialization, алгоритмы для строк и самый тормозящий boost.cgi. В них вроде не особо много шаблонов.

Deleted
()
Ответ на: комментарий от ilias

Особенность шедулера процессов. В поиске подробнее.

anon_666
()
Ответ на: комментарий от gizzka

Товарищ выше дал правильную ссылку про Precompiled headers. Глянь, должно помочь.

Чем они помогут в случае шаблонов?

2ТС: смирись, ничего особо не сделаешь. Пиши на лиспе :)

mv ★★★★★
()

1. Не использовать boost.

2. Не использовать C++.

3. Не использовать Си.

Все вышеперечисленные вещи страдают архитектурным изъяном негативно влияющим на возможную минимизацию времени сборки. А именно:

1. boost - оверюз шаблонов таким образом, каким их юзать и не предполагалось.

2. C++ - наличие недостаточно гибких по реализации шаблонов (смотрите как это можно реализовать в языке D). В самом языке кривая грамматика (контекстно-зависимая) и отсутствует система модулей. Из-за этого в частности приходится парсить много раз один и тот же код, а также отсутствует возможность качественно параллелизовать этот процесс.

3. Си - собственно этот тот язык из которого все растет. С++ просто остался максимально обратно совместимым с Си. Зло нужно искоренять.

Для вышеперечисленных проблем существуют различные костыли: PCH, ccache, distcc. Когда-то они помогают, но существенно ничего не меняется.

Серьезно.. начните отказываться от (1), (2) и (3) уже сегодня.

nsf
()
Ответ на: комментарий от anonymous

И тем не менее после того, как я заюзал PCH, время полной пересборки уменьшилось с 12 минут до 8.

PS. Выяснилось, что больше всего на время сборки влияет именно boost.cgi.

Deleted
()
Ответ на: комментарий от nsf

> Все вышеперечисленные вещи страдают архитектурным изъяном негативно влияющим на возможную минимизацию времени сборки

3. Си - собственно этот тот язык из которого все растет

Откуда такой бред? Где архитектурные изъяны языка Си, влиящие на время сборки?

anonymous
()

>использует кучу библиотек boost

ССЗБ

anonymous
()

distcc + ccache распараллеливает, можно задействовать несколько компьютеров. -j3 в случае использования двух ядер распараллеливает задачу на имеющихся в процессоре компьютерах. Смысла ставить число после j чем количества ядер мало. Но количество ядер, и ещё плюс один, скорость сборки всё же немного увеличит. Не спрашивай почему, я не знаю

Zenithar
()
Ответ на: комментарий от Zenithar

немного уточню, distcc распараллеливает процесс сборки между хостами
ccache использует кэш предыдущих сборок, учитываются соответствия исходных файлов, флаги компиляции и собственно сам компилятор. Проблемы с ccache возможны только в случае неисправного железа.
-j2 может ускорить процесс на одноядерном проце. Пока один сишник переводится в объектный файл, второй подгружается с диска, это устранит простои процессора в случае небольших исходников(возможно, сочиняю).
-pipe - передаёт результаты сборки не через файл на диске, а через конвейер, то бишь, через оперативную память.

backbone ★★★★★
()
Ответ на: комментарий от backbone

Спасибо! И вкратце, и понятно. Ещё хорошо помогает сбрка вообще без оптимизаций (-O0) и отключение дебаггерской информации. В первом ответе всё перечислено! Я просто хотел разъяснить подробнее

Zenithar
()
Ответ на: комментарий от anonymous

Откуда такой бред? Где архитектурные изъяны языка Си, влиящие на время сборки?

У C один, но огромный архитектурный изъян. Это необходимость в толстом проекте по миллион раз перекомпиливать одно и то же (хидеры). Но в C эту проблему частично решают precompiled headers.

Этот изъян в полной мере унаследован C++. Но в нем прибавились еще и шаблоны, которые прекомпилировать бесполезно.

Deleted
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.