Советы, чтобы сделать сборки быстрее - PullRequest
8 голосов
/ 18 января 2012

Есть ли способ ускорить сборку / компиляцию программного обеспечения?У нас есть дерево сборки c, c ++, использующее make-файл, который занимает около 2 часов для свежих сборок.Я сталкивался с несколькими коммерческими решениями, такими как ElectricAccelerator, Sparkbuild, есть ли эквивалент с открытым исходным кодом?

Ответы [ 7 ]

9 голосов
/ 18 января 2012

Поиск в Google может помочь в получении списка программ с открытым исходным кодом.
С вашим кодом вы можете сделать следующее, чтобы сократить время сборки:

  • Используйте Форвардные объявления везде, где это возможно.
  • Использование объявлений пространства имен вместо директивы пространства имен .
  • Убедитесь, что у вас нет ненужных включений.
9 голосов
/ 18 января 2012

Возможно, вы захотите посмотреть distcc , ccache и, конечно, -j make option.

4 голосов
/ 18 января 2012

В нашей компании было много продуктов, которые имеют более длительное время сборки, например, 3-6 часов.

Мы использовали 2 метода.

  1. Использовать параллельную сборку с -j опцией make
  2. Смонтировать ОЗУ как диск . Затем переместите все файлы туда и скомпилируйте. Но вам нужно много оперативной памяти для этого. Мы использовали экземпляры Amazons ec2. Это было довольно дорого.
2 голосов
/ 18 января 2012

Один из способов - просто запустить сборку на более быстром оборудовании.Я понимаю, что это не всегда вариант, но это все же нужно учитывать.

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

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

1 голос
/ 08 ноября 2017

Вы не указали конфигурационное программное обеспечение, но мы обнаружили проблему с clearcase.Из-за того, как он оценивает правила для каждого файла отдельно, узким местом может быть просто открытие файла.Даже подумайте о том, чтобы читать дальше, если вы «застряли» с прозрачным регистром.

Итак, мы обнаружили, что, изменив защитные элементы для заголовочных файлов, вы можете сократить время сборки до 1/30 времени (для нас этоdid).

По сути, в ваших заголовочных файлах у вас есть защитный щит наверху, например:

#ifndef FOO_H
#define FOO_H
your code
#endif

Затем в другом месте вы #include foo.h.Правильно, хорошо, мы обнаружили, что из-за некоторой ужасной связи файлов типов и того, что некоторые общие заголовки включались сотни раз для каждого скомпилированного нами файла .c.С недостатком дизайна в прозрачном корпусе это означает, что каждый из этих файлов нужно открывать сотни раз только для того, чтобы игнорировать содержимое и снова закрывать файл.

Итак ... вместо простого #include для foo используйте guard для условновключить фу.Обычно это плохая практика и ужасный кошмар обслуживания (если кто-то начнет менять охрану).

Итак ... в вашем файле .c вы в конечном итоге сделаете что-то вроде:

#include <stdio.h>
#ifndef FOO_H
#include "foo.h"
#endif
#ifndef FOO_H
#include "foo.h"
#endif
... rest of your code implementation

Как я уже сказал ... плохая практика, но если вы используете clearcase и он кусает вас 3-4 раза (как мы это делали) ... возможно, стоит подумать (или просто сделать копию всего дерева снаружи)ClearCase).Или канаву в прозрачном кейсе.Или лучше справьтесь с взаимозависимостями типов.

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

0 голосов
/ 28 января 2012

Мы используем комбинацию distmake, ccache и makefile-generator, которая создает распараллеливаемый make-файл.C/C++ сборки могут очень хорошо распараллеливать;часто все .o файлы могут быть скомпилированы параллельно.

Distmake - это распределенная реализация make, основанная на GNU Make и выпущенная под GPL.Я поддерживаю это.Это позволяет вам распараллеливать на нескольких хостах.Это требует, чтобы все хосты имели одинаковое представление о файловой системе, например.NFS, чтобы одна и та же команда могла выполняться на любом хосте сборки.

Отключение оптимизаций приведет к более быстрой сборке, если у вас есть такая опция.

Если вы уже используете архитектуру параллельной сборкии это все еще медленно, возможно, вам просто нужно изучить это.Наблюдайте за его продвижением с помощью секундомера и посмотрите, где оно узкое место.Ищите «длинные столбы», которые, возможно, вы не ожидали.Удачи.

0 голосов
/ 18 января 2012

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

...