Как вы сокращаете время компиляции и связываете время для проектов Visual С++ (собственный С++)?

Как вы сокращаете время компиляции и связываете время для проектов VС++ (собственный С++)?

Пожалуйста, укажите, подходит ли каждое предложение для отладки, выпуска или того и другого.

Ответ 1

Это может показаться вам очевидным, но мы стараемся как можно больше использовать форвардные объявления, даже если требуется записать длинные имена пространства имен, тип есть/находится в:

// Forward declaration stuff
namespace plotter { namespace logic { class Plotter; } }

// Real stuff
namespace plotter {
    namespace samples {
        class Window {
            logic::Plotter * mPlotter;
            // ...
        };
    }
}

Это значительно сокращает время для компиляции других компиляторов. Действительно, это относится ко всем конфигурациям:)

Ответ 2

Используйте Образец Handle/Body (также иногда называемый "pimpl", "adapter", "decorator", "bridge" или "обертка" ). Отделив реализацию ваших классов в ваших .cpp файлах, их нужно только компилировать один раз. Большинство изменений не требуют изменений в файле заголовка, поэтому это означает, что вы можете сделать довольно обширные изменения, в то время как требуется только перекомпилировать один файл. Это также способствует рефакторингу и написанию комментариев и модульных тестов, поскольку время компиляции уменьшается. Кроме того, вы автоматически разделяете проблемы интерфейса и реализации, чтобы упростить интерфейс вашего кода.

Ответ 3

Если у вас есть большие сложные заголовки, которые должны быть включены большинством .cpp файлов в процессе сборки и которые не изменяются очень часто, вы можете предварительно их скопировать. В проекте Visual С++ с типичной конфигурацией это просто вопрос включения их в stdafx.h. У этой функции есть свои хулители, но библиотеки, которые в полной мере используют шаблоны, имеют тенденцию иметь много вещей в заголовках, а предварительно скомпилированные заголовки - это самый простой способ ускорить сборку в этом случае.

Ответ 4

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

Передовые декларации являются общим решением.

Распределенное здание, например, с Incredibuild - это победа.

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

Решение, о котором я не читал, но использовал, состоит в разделении больших заголовков. Если у вас есть несколько очень больших заголовков, взгляните на них. Они могут содержать связанную информацию и могут также зависеть от множества других заголовков. Возьмите элементы, которые не имеют зависимости от других файлов... простых структур, констант, перечислений и передовых объявлений и переместите их от the_world.h до the_world_defs.h. Теперь вы можете обнаружить, что многие исходные файлы теперь могут включать только the_world_defs.h и не включать все эти накладные расходы.

В Visual Studio также есть опция "Показать включает", которая может дать вам представление о том, какие исходные файлы включают в себя множество заголовков и какие файлы заголовков чаще всего включены.

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

Ответ 6

Мы используем Xoreax Incredibuild для параллельной работы компиляции на нескольких машинах.

Ответ 7

Вопрос о скорости компиляции достаточно интересен тем, что Stroustrup имеет его в FAQ.

Ответ 9

Наши машины для разработки - это четырехъядерные процессоры, и мы используем Visual Studio 2008 для параллельной компиляции. Я не уверен, что все версии VS могут сделать это.

У нас есть файл решения с примерно 168 отдельными проектами, и компиляция таким образом занимает около 25 минут на наших четырехъядерных машинах по сравнению с примерно 90 минутами на одноядерных ноутбуках, которые мы даем летним студентам. Не совсем похожие машины, но вы получаете идею:)

Ответ 10

С Visual С++ существует метод, некоторые называются Unity, что значительно улучшает время связи, уменьшая количество объектных модулей.

Это включает конкатенацию кода С++, обычно в группы по библиотеке. Это, конечно, делает редактирование кода намного сложнее, и вы столкнетесь с конфликтами пространства имен, если не используете их хорошо. Это не позволяет вам использовать "using namespace foo";

Несколько команд нашей компании разработали сложные системы, чтобы взять обычные файлы на С++ и объединить их во время компиляции в качестве шага сборки. Сокращение времени соединения может быть огромным.

Ответ 11

Еще один полезный метод - раскалывание. Я думаю, что это нечто похожее на то, что было описано Мэттом Шоу.

Проще говоря, вы просто создаете один файл cpp, в который вы включаете другие файлы cpp. У вас могут быть две разные конфигурации проекта: один обычный и один блоб. Конечно, раскалывание создает некоторые ограничения на ваш код, например. имена классов в неназванных пространствах имен могут столкнуться.

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

Мы используем blobbing на работе большую часть времени, и это сокращает время сборки проекта, особенно время соединения.

Ответ 12

Время компиляции:
Если у вас есть IncrediBuild, время компиляции не будет проблемой. Если у вас нет IncrediBuild, попробуйте метод создания "единства сборки". Он объединяет несколько файлов cpp в один файл cpp, поэтому сокращается время компиляции.
Время ссылки:
Метод "построения единой сборки" также способствует сокращению времени соединения, но не так много. Как бы то ни было, вы можете проверить, включены ли "Глобальная оптимизация" и "LTCG", в то время как эти флаги делают программу быстрой, они делают ссылку SLOW.
Попробуйте отключить "Целую глобальную оптимизацию" и установите LTCG на "Default", время соединения может быть уменьшено на 5/6.
(LTCG означает генерацию кода временного кода)