оптимизация — Ускорение сборок C ++ с Unity Builds и уменьшенными зависимостями заголовка

Я только что преобразовал проект Objective-C (++) в простой C ++.
Перемещая все больше и больше кода, я заметил, что время сборки значительно увеличилось.

Мой проект в настоящее время разделен на несколько фреймворков / dylibs и основной проект, который использует эти фреймворки.

Я провел небольшое исследование и обнаружил, что в основном рекомендуется сократить время сборки на три вещи:

  • уменьшение зависимости заголовка
  • используя единство
  • использование такого инструмента, как ccache, чтобы не повторять ненужную работу все время

Я реализовал ccache, и он прекрасно работает, и мне удалось немного сократить время сборки.

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

Я читал, что плохой практикой является использование «зонтичных заголовков», таких как «MyFramework.h», которые будут включать все публичные заголовки данной платформы, хотя вам может понадобиться только несколько из них.

Какао везде использует зонтичные заголовки, и это, конечно, намного проще, чем выбирать точные заголовки, необходимые для каждого исходного файла.
Тем не менее, при использовании Unity сборок у меня будет только один заголовок для каждой структуры, правильно?

Имеет ли смысл выбирать отдельные заголовки, или использование «зонтичных заголовков» будет приемлемым для построения единства?

Нажмите здесь, в темноте, и не хотите тратить время на внедрение техники, которая в итоге не поможет.

Спасибо за вашу помощь!

0

Решение

Это похоже на вопрос для самоуверенных ответов. Мои такие:

Всегда уменьшайте зависимости заголовка. Уменьшенные зависимости делают общую архитектуру более чистой. Независимые маленькие индивидуальные модули с четко распределенными обязанностями всегда лучше работать, чем спагетти.

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

Большую часть времени работайте с отдельными модулями (несколько файлов cpp) и модульными тестами для них. В противном случае вы создаете целую программу, затем переходите в нее к интересующей вас ситуации, затем добавляете туда отладчик и так далее. Может быть, вам это нравится, но я слишком ленив, это скучно повторяется и тратит впустую мое время. Только связывание всей программы на C ++ (чего угодно) обычно занимает десять и более минут, и мне не нужно так много перерывов на кофе.

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

-1

Другие решения

Других решений пока нет …