Bezdepbonusu7Программирование: статьи и ответы

Вопрос

Советы по сокращению времени компоновки C++

Автор вопроса: Lucas MeijerОтветов: 6

У меня есть проект, который связывается с g++ и ld примерно за 8 секунд.

Он использует кучу статических библиотек, большая часть кода написана на C++.

Меня интересует общий список советов о том, как сократить время ссылки. Что-нибудь от "не включайте отладочные символы" до "сделайте свой код менее спагетти"

  • Используете ли вы генерацию кода времени ссылки? Это будет производить более быстрый код, но время компоновки увеличится. Billy ONeal 29.12.2010
  • 8 секунд быстро. Это не похоже на то, о чем стоит беспокоиться. Насколько велик проект? CB Bailey 29.12.2010
  • Платформа и компилятор? С GCC и binutils gold работает быстрее, чем (классический) ld , и clang может (а может и не быть) быстрее. ephemient 29.12.2010
  • Я могу выполнить полную сборку и связать свой проект примерно с 800 000 LOC примерно за 10 секунд. David Heffernan 29.12.2010
  • 0,8 миллиона строк кода за 10 секунд? У меня есть отдельные единицы перевода, которые занимают больше времени! Billy ONeal 29.12.2010

c++linker

Ответы

Ответ 1 · рейтинг 13 · brewbuck

Я имел дело с этим в течение многих лет на предыдущей работе. Компоновщик GNU просто имеет серьезные проблемы с производительностью при компоновке большого количества статических библиотек. В какой-то момент время компоновки соответствовало времени компиляции, что показалось нам настолько странным, что мы действительно исследовали это и выяснили.

Вы можете попытаться объединить свои статические библиотеки в "суперобъект" перед связыванием. Вместо такой ссылки:

$ g++ -o program program.o $STATIC_LIBS

Вы можете попробовать это:

$ ld -r -o libraries.o --whole-archive $STATIC_LIBS
$ g++ -o program program.o libraries.o

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

Ответ 2 · рейтинг 4 · engf-010

создайте виртуальный диск, скомпилируйте его и свяжите с жестким диском.

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

Ответ 3 · рейтинг 2 · Ben Voigt

Отключите оптимизацию всей программы (хотя бы на время разработки). Используйте p-impl для уменьшения зависимостей.

Ответ 4 · рейтинг 1 · Wyatt Anderson

8 секунд - это довольно быстро, если только вы не уверены, что это не займет так много времени. У меня есть проекты, полная перелинковка которых занимает 5-8 минут, поскольку мы не делаем добавочную компоновку в наших релизных сборках. Пробовали ли вы использовать инкрементное связывание (если вы не используете -shared, вы можете использовать -i или -r)?

Ответ 5 · rubenvb

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

Ответ 6 · Community

Вы можете попробовать использовать clang и lld. От godot документы

Вы также можете использовать Clang и LLD для создания Godot. У этого есть два преимущества по сравнению с настройкой GCC + GNU ld по умолчанию:

LLD связывает Godot значительно быстрее по сравнению с GNU ld или gold. Это приводит к более быстрому времени итерации.

Перевод вопроса и ответов сообщества Stack Overflow, лицензия CC BY-SA. Оригинал на Stack Overflow.

Похожие материалы