Как оптимизировать скорость сборки в visual studio 2008 - PullRequest
10 голосов
/ 14 декабря 2010

Может ли кто-нибудь дать мне советы по увеличению скорости сборки в visual studio 2008?
У меня большой проект со множеством модулей с полным исходным кодом.Каждый раз, когда он создается, все файлы перестраиваются, некоторые из них не менялись.Могу ли я предотвратить восстановление этого файла?Я включил свойство «Разрешить минимальную перестройку» / Гм, но компилятор выдал это предупреждение

Command line warning D9030 : '/Gm' is incompatible with multiprocessing; ignoring /MP switch

Все советы по увеличению скорости сборки мне очень помогут.Спасибо,

Ответы [ 5 ]

16 голосов
/ 08 декабря 2012

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

Классическим дешевым решением является "Unity build".Это просто означает использование #include, чтобы собрать все ваши файлы .cpp в один файл для компиляции.«Unity build» возникла здесь во многих вопросах о stackoverflow, здесь - самый выдающийся из известных мне.Эта screencast демонстрирует, как настроить такую ​​сборку в Visual Studio.

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

Помимо сборок Unity, вот список моих лучших практик:

  • Используйте #include только в случае необходимости, предпочитайте предварительные объявления
  • Используйте идиому pimpl, чтобы не допустить реализации класса из обычно включаемых заголовочных файлов.Это позволяет добавлять элементы в реализацию без длительной перекомпиляции
  • Использовать предварительно скомпилированные заголовки (pch) для часто включаемых заголовочных файлов, которые редко меняются
  • Убедитесь, что ваша система сборки работает.используя все ядра, доступные на локальном оборудовании
  • Сохраняйте список каталогов, который препроцессор должен искать минимально, используйте точные пути в #include инструкциях
  • Используйте #pragma once в верхней частизаголовочные файлы вместо #ifndef __FOO_H #define __FOO_H ... #endif, если вы используете трюк #ifndef, компилятору придется открывать заголовочный файл каждый раз, когда он включается, #pragma once позволяет компилятору быть более эффективным

Если вы делаете все это (сборка Unity будет иметь наибольшее значение, по моему опыту), последний вариант - распределенное построение. distcc - лучшее бесплатное решение, которое я знаю, incredibuild - это проприетарный отраслевой стандарт.Я придерживаюсь мнения, что распределенные вычисления будут единственным способом получить отличное время итерации от грязного процесса компиляции C ++.Если у вас есть доступ к достаточно большому количеству машин (скажем, 10-20), это абсолютно стоит изучить.Я должен отметить, что сборки Unity и распределенные сборки не являются полностью симбиотическими, потому что традиционная компиляция может быть разбита на меньшие части работы, чем сборка Unity.Если вы хотите распространяться, то, вероятно, не стоит настраивать сборку Unity.

6 голосов
/ 03 октября 2012

Enable Minimal Build: /Gm несовместимо с Build with Multiple Processes: /MP{<cores>}
Таким образом, вы можете использовать только один из этих двух одновременно.

/ Gm> Свойства проекта: Свойства конфигурации > C / C ++ > CodeGeneration
или
/ MP {n}> Свойства проекта: Свойства конфигурации > C / C ++ > Командная строка


Также для предотвращения ненужных сборок (нетронутых файлов) - правильно структурируйте свой код ; Следуйте этому правилу:

В заголовочных файлах [.h] поместите только то, что нужно , в содержимое самого заголовочного файла;
и все, что вам нужно разделить между несколькими исполнительными блоками.

Остальное идет в файлах реализации [.c / .cpp].

3 голосов
/ 14 декабря 2010

Одним простым способом является компиляция в режиме отладки (иначе говоря, нулевая оптимизация), это, конечно, только для внутреннего тестирования.

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

* с /MP необходимо создать предварительно скомпилированный заголовок перед многопроцессной компиляцией, так как /MP может читать, но не записывать в соответствии с MSDN

2 голосов
/ 07 декабря 2012

Восстановление всех файлов после изменения одного заголовочного файла является распространенной проблемой. Решение состоит в том, чтобы внимательно изучить то, что #include использует ваши заголовочные файлы, и удалить все, что можно удалить. Если ваш код использует только указатели и ссылки на класс, вы можете заменить

#include "foo.h"

с

class Foo;
2 голосов
/ 14 декабря 2010

Можете ли вы предоставить больше информации о структуре вашего проекта и о том, какие файлы перестраиваются?
Неизмененные файлы C ++ могут быть перестроены, поскольку они содержат измененные заголовочные файлы, в этом случае параметр / Gm не поможет

...