Как оптимизировать скорость строительства в visual studio 2008

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

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

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

Ответ 1

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

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

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

Ответ 2

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

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

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

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

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

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

Ответ 3

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

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


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

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

Остальное относится к файлам реализации [ .c/ .cpp].

Ответ 4

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

Ответ 5

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

#include "foo.h"

с

class Foo;