26 апреля 2008

Speeding up compilation

Компиляция C++ проектов - вещь довольно затратная по времени. Что можно предпринять для ускорения? Мои советы такие:

1. Разбивайте проект на отдельно компилируемые файлы - тогда при изменении одного фрагмента системы перекомпилируется только этот файл. Тут, правда, палка о двух концах - возрастет время rebuild-а, но полный ребилд делается обычно реже чем фазы "немного поправил - скомпилировал".

2. Включайте (#include) только самое необходимое. Иногда достаточно включить some_forward.h или some_feature1.h вместо большого some.h. Для использовании ссылки или указателя на класс компилятору не нужно знать все о классе - пользуйтесь этим при написании header-файлов:
//вместо #include "SomeClass.h"
class SomeClass;

void Foo(SomeClass&);
void Bar(SomeClass*);
А шаблоны вообще раскрываются в момент использования, а не декларации.

3. Распараллеливайте компиляцию на несколько процессоров.

4. Тривиально: поставьте побольше оперативной памяти.

5. Во время компиляции запустите system monitor и убедитесь, что не только процессор и память имеют значение. Узкое место: жесткий диск. Поставьте два три четыре быстрых диска в RAID0. Я серьезно.

2 комментария:

Андрей Валяев комментирует...

В случае использования любого unix не стоит забывать про distcc - это дает возможность распаралелить сборку на несколько компьютеров.

Хотя честно говоря с трудом могу представить проект, которому не достаточно одного компьютера, и, ну максимум, нескольких часов сборки.

А отдельно взятым разработчикам обычно нет смысла постоянно пересобирать все.

Alno комментирует...

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

Особенно полезно, когда работаете с каким-нибудь генерируемым кодом.

Мне около года назад приходилось использовать его для проекта, где генерировалось огромное количество кода. С ccache получил значительное ускорение, сейчас цифр не помню уже, правда.

Хотя эффект очень сильно зависит от проекта, конечно.