Как улучшить время сборки / компиляции? - PullRequest
9 голосов
/ 08 октября 2009

Я использую Visual Studio, и кажется, что избавление от неиспользуемых ссылок и использование операторов ускоряет время моей сборки в больших проектах. Существуют ли другие известные способы ускорения времени сборки. А как насчет других языков и сред сборки?

Что обычно является узким местом при сборке / компиляции? Диск, процессор, память?

Что такое список / являются хорошими ссылками для распределенных сборок?

Ответы [ 12 ]

6 голосов
/ 08 октября 2009

Самое большое улучшение, которое мы сделали для нашего большого проекта C ++, заключалось в распространении наших сборок. Пару лет назад полная сборка занимала около получаса, а сейчас - около трех минут, из которых треть - время соединения.

Мы используем запатентованную систему сборки, но IncrediBuild отлично работает для многих людей (мы не смогли заставить ее работать надежно).

3 голосов
/ 08 октября 2009

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

По сути, он пытается минимизировать объем кода, скопированного в заголовках препроцессором, путем минимизации размера заголовка. Это было сделано путем перемещения всего, что не было общедоступным, в закрытый класс друзей, вот пример.

foo.h:

class FooPrivate;
class Foo
{
public:
   Foo();
   virtual ~Foo();
   void bar();
private:
   friend class FooPrivate;
   FooPrivate *foo;
};

foo.cpp:

Foo::Foo()
{
   foo = new FooPrivate();
}

class FooPrivate
{
    int privData;
    char *morePrivData;
};

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

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

3 голосов
/ 08 октября 2009
3 голосов
/ 08 октября 2009

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

2 голосов
/ 08 октября 2009

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

2 голосов
/ 08 октября 2009

Если вы используете много файлов и много шаблонного кода (STL / BOOST / и т. Д.), То массовая сборка или сборка Unity должна сократить время сборки и связывания.

Идея Bulk Builds состоит в том, чтобы разбить ваш проект на подразделы и включить все файлы CPP в этом подразделе в один файл. В сборках Unity это еще больше благодаря наличию скомпилированного файла Single CPP, который включает все остальные файлы CPP.

Причина, по которой это часто происходит быстрее:

1) Шаблоны оцениваются только один раз для массового файла

2) Включаемые файлы открываются / обрабатываются только один раз для каждого массового файла (при условии, что во включаемом файле есть соответствующая оболочка #ifndef FILE__FILENAME__H / #define FILE__FILENAME__H / #endif). Сокращение общего количества операций ввода-вывода - это хорошая вещь для времени компиляции.

3) У компоновщика гораздо меньше данных для работы (файл Single Unity OBJ или несколько файлов Bulk OBJ), и он с меньшей вероятностью выполняет перенаправление в виртуальную память.

РЕДАКТИРОВАТЬ Добавление пары из ссылок здесь при переполнении стека в Unity Builds.

2 голосов
/ 08 октября 2009

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

К сожалению, это было написано до того, как шаблоны стали настолько важными. Шаблоны убивают в реальном времени, когда дело доходит до компиляции C ++. Особенно, если вы допустите ошибку и везде будете использовать умные указатели. В этом случае вы можете только постоянно обновляться до новейшего процессора и последних SSD накопителей. MSVC уже является самым быстрым из существующих компиляторов C ++, если вы используете предварительно скомпилированные заголовки.

http://ecx.images-amazon.com/images/I/51HNJ7KBBAL._BO2,204,203,200_PIsitb-sticker-arrow-click,TopRight,35,-76_AA240_SH20_OU01_.jpg

1 голос
/ 08 октября 2009

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

Например, в C - если вы генерируете файлы LST, ваша компиляция займет несколько лет.

0 голосов
/ 02 октября 2013

Время компиляции и хрупкая проблема базового класса: я написал блог о том, как улучшить время компиляции в C ++. Link .

0 голосов
/ 18 июля 2013

Для C # - использование фиксированных версий для ваших сборок вместо автоинкрементных значительно ускоряет последующие локальные сборки.

AssemblyInfo.cs

// takes longer to update version number changes on all references to this assembly
[assembly: AssemblyVersion("1.0.*")]

// this way already built assemblies do not need to be recompiled 
// to update version number changes.
[assembly: AssemblyVersion("1.0.0.0")]
...