Быстрая компиляция через gcc
От: maks1180  
Дата: 25.12.21 14:33
Оценка: +1 -1
заметил я что если создать файл main.cpp c содержимым
#include "file1.cpp"
#include "file2.cpp"
#include "file3.cpp"
и скомпилировать его, то в моём случаи это в 5 раз быстрее, чем вызвать gcc file1.cpp file2.cpp file3.cpp. Файлов cpp у меня порядка 30-40.
Может у gcc есть такая опция, что-бы не создавать main.cpp. Т.е. что-бы он компилировал кучу cpp файлов как один большой ?
Таким способом размер бинарника иногда отличается в большую или меньшую сторону, по сравнению с обычной компиляцией. Не пойму пока почему так.
===============================================
(реклама, удалена модератором)
Отредактировано 25.12.2021 14:37 maks1180 . Предыдущая версия . Еще …
Отредактировано 25.12.2021 14:35 maks1180 . Предыдущая версия .
Отредактировано 25.12.2021 14:35 maks1180 . Предыдущая версия .
Re: Быстрая компиляция через gcc
От: alpha21264 СССР  
Дата: 25.12.21 15:16
Оценка:
Здравствуйте, maks1180, Вы писали:

M>заметил я что если создать файл main.cpp c содержимым

M>#include "file1.cpp"
M>#include "file2.cpp"
M>#include "file3.cpp"
M>и скомпилировать его, то в моём случаи это в 5 раз быстрее, чем вызвать gcc file1.cpp file2.cpp file3.cpp.
Skip
M>Не пойму пока почему так.

Потому что инклюды и все шаблоны в них обрабатываются один раз.
Можно и в сто раз ускориться.
https://sunveter.ru/uploads/posts/2016-06/1465378699_47.gif
Течёт вода Кубань-реки куда велят большевики.
Re: Быстрая компиляция через gcc
От: watchmaker  
Дата: 25.12.21 15:30
Оценка: +1
Здравствуйте, maks1180, Вы писали:


M>то в моём случаи это в 5 раз быстрее

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

Правда надо сказать, что часто это не столько unity build сам по себе ускоряет компиляцию, а злоупотребление header-only библиотеками сильно её замедляет. А unity build лишь снижает их вред.


M>Может у gcc есть такая опция, что-бы не создавать main.cpp. Т.е. что-бы он компилировал кучу cpp файлов как один большой ?

Зачем такая опция в компиляторе, если проще сделать это в системе сборки? Всё равно там уже хранятся зависимости между файлами, и там же отслеживаются изменения в графе сборки, когда что-то поменялось и нужно составить список целей, которые надо пересобрать.

M>Таким способом размер бинарника иногда отличается в большую или меньшую сторону, по сравнению с обычной компиляцией. Не пойму пока почему так.

Так посмотри что там отличается :)
Например, эффекты unity build, влияющие на размер:
1. склеивание internal linkage функций/констант, которые почему-то имеют такой linkage, но используются в нескольких местах;
2. агрессивное встраивание, подобно lto;
3. невозможность удаления недостижимого кода/данных на уровне объектных файлов (если не используется -ffunction-sections и подобное)
Re: Быстрая компиляция через gcc
От: Vamp Россия  
Дата: 25.12.21 15:32
Оценка:
Здравствуйте, maks1180, Вы писали:

Почему быстрее — примерно понятно (выше написали). Почему отличается размер — тоже понятно, появляется больше возможностей для inline.

Подобная практика обычно не применяется, ибо способна сломать код — например, static символы приобретут глобальную видимость, так что никаких стандартных средств в компиляторе для эмуляции такого поведения нет. Я рекомендую паралелльную компиляцию.
Да здравствует мыло душистое и веревка пушистая.
Отредактировано 25.12.2021 15:36 Vamp . Предыдущая версия .
Re: Быстрая компиляция через gcc
От: fk0 Россия  
Дата: 25.12.21 16:01
Оценка: 9 (2)
Здравствуйте, maks1180, Вы писали:

M>заметил я что если создать файл main.cpp c содержимым

M>#include "file1.cpp"
M>#include "file2.cpp"
M>#include "file3.cpp"
M>и скомпилировать его, то в моём случаи это в 5 раз быстрее, чем вызвать gcc file1.cpp file2.cpp file3.cpp. Файлов cpp у меня порядка 30-40.
M>Может у gcc есть такая опция, что-бы не создавать main.cpp. Т.е. что-бы он компилировал кучу cpp файлов как один большой ?

gcc -include file1.cpp -include file2.cpp... -x c++ /dev/null
Re: Быстрая компиляция через gcc
От: flаt  
Дата: 25.12.21 17:55
Оценка:
Здравствуйте, maks1180, Вы писали:


M>Таким способом размер бинарника иногда отличается в большую или меньшую сторону, по сравнению с обычной компиляцией. Не пойму пока почему так.


Это называется amalgamation. Используют, когда хотят упростить сборку (SQLite, например). А для ускорения сборки.. Наоборот, раньше компиляторам сносило крышу от больших размеров файлов исходников.
Re: Быстрая компиляция через gcc
От: _NN_ www.nemerleweb.com
Дата: 26.12.21 09:50
Оценка: +2
Здравствуйте, maks1180, Вы писали:

M>заметил я что если создать файл main.cpp c содержимым

M>#include "file1.cpp"
M>#include "file2.cpp"
M>#include "file3.cpp"
M>и скомпилировать его, то в моём случаи это в 5 раз быстрее, чем вызвать gcc file1.cpp file2.cpp file3.cpp. Файлов cpp у меня порядка 30-40.
M>Может у gcc есть такая опция, что-бы не создавать main.cpp. Т.е. что-бы он компилировал кучу cpp файлов как один большой ?
M>Таким способом размер бинарника иногда отличается в большую или меньшую сторону, по сравнению с обычной компиляцией. Не пойму пока почему так.

С другой стороны изменение одного файла повлечёт за собой полную пересборку всего.
К тому же собирая таким способом нужно учесть, чтобы в файлах внутренние классы и функции были с различными именами, проблема которой нет в случае разных файлов.
Тут надо смотреть какие плюсы перевешивают какие минусы

Кстати, вы используете Предкомпилированные заголовочные файлы ?
Это даёт существенное ускорение сборки при множестве файлов с повторяющимися инклудами.
http://rsdn.nemerleweb.com
http://nemerleweb.com
Re[2]: Быстрая компиляция через gcc
От: SaZ СССР  
Дата: 02.01.22 15:01
Оценка:
Здравствуйте, _NN_, Вы писали:

_NN>...

_NN>Кстати, вы используете Предкомпилированные заголовочные файлы ?
_NN>Это даёт существенное ускорение сборки при множестве файлов с повторяющимися инклудами.

Ну это как сказать. У нас в проекте достаточно много буста и стл. Для Clang время полной сборки с PCH примерно на 10-15% быстрее, для gcc примерно на 20% медленнее.
http://rsdn.org/tools/member.aspx?id=SaZ
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.