Я компилирую 2 проекта C++ в buildbot на каждой фиксации. Оба - приблизительно 1 000 файлов, каждый - 100 kloc, другие 170 kloc. Время компиляции очень отличается от gcc (4.4) к Visual C++ (2008).
Компиляции Visual C++ для одного взятия проекта за эти 20 минут. Они не могут использовать в своих интересах несколько ядер, потому что проект зависит от другого. В конце полная компиляция обоих проектов в Отладке и Выпуске, в 32 и 64 битах занимает больше чем 2 1/2 часа.
компиляции gcc для одного взятия проекта за эти 4 минуты. Это может быть параллелизировано на этих 4 ядрах и занимает приблизительно 1 минуту 10 secs. Все 8 сборок для 4 версий (Отладка/Выпуск, 32/64 бита) этих 2 проектов компилируются меньше чем за 10 минут.
Что происходит со временем компиляции Visual C++? Они в основном в 5 раз медленнее.
Каково среднее время, которое, как могут ожидать, скомпилирует C++ kloc? Мои - 7 s/kloc с vc ++ и 1.4 s/kloc с gcc.
Что-нибудь может быть сделано ко времени компиляции ускорения на Visual C++?
Одна вещь, которая замедляет компилятор VC ++, - это наличие файла заголовка, который инициализирует конкретные экземпляры нетривиальных типов значений const
. Вы можете увидеть это с константами типа std :: string
или идентификаторами GUID. Это влияет как на время компиляции, так и на время компоновки.
Для одной DLL это привело к 10-кратному замедлению. Помогает, если вы поместите их в предварительно скомпилированный файл заголовка или просто объявите их в заголовке и инициализируете в файле cpp.
Взгляните на антивирусный сканер и обязательно поэкспериментируйте с предварительно скомпилированными заголовками, без него вы не увидите VC ++ в лучшем виде.
О да, и убедитесь, что папка% TMP% находится в том же разделе, что и ваша сборка, поскольку VC ++ создает временные файлы и перемещает их позже.
Кажется очень странным, что существует такая разница ... но также нет причин, по которым вы не можете воспользоваться преимуществами многоядерных процессоров Visual!
В основном у вас есть 4 режима компиляции: (Отладка / Выпуск) x (32 бита / 64 бита), каждый из которых полностью независим от другого, вы можете отлично запустить 4 параллельно, используя все преимущества 4 доступных ядер. Или просто попробуйте многопроцессорный подход в Visual Studio.
Однако это никуда не годится. 150 минут против 10 минут - огромный разрыв. По моему личному опыту, есть 2 основных фактора сокращения времени компиляции:
Возможно, возникла проблема с проверкой зависимостей, если вы не выполняете принудительное полное перестроение.
Вы можете создать статические библиотеки. Поместите редко меняющийся код в библиотеки.
Самые медленные части сборки программы:
В общем, этапы связывания и создания исполняемого файла являются самыми быстрыми.
Вы определили:
Помните, при определении эффективности всегда профилируйте (тем или иным способом).
Прежде всего, в большинстве случаев вы можете собирать отладочную и релизную конфигурации одного и того же проекта параллельно.
Также то, что вы описываете, звучит ужасно медленно - похоже, что вы не используете прекомпилированные заголовки в VC++ или используете их неправильно - они специально предназначены для улучшения времени компиляции.
Вы строите на одной машине? Вы используете ту же ОС? Я видел разницу в скорости в районе 3-10x при сравнении GCC в Cygwin и GCC на машине VirtualBox, работающей внутри Windows, на которой размещен Cygwin.
Как вы строите проекты Visual Studio? Вы просто запускаете ide (devenv) с проектом и / build
, или у вас есть make-файл, аналогичный тому, который, как я предполагаю, вы используете для gcc. Я предполагаю, что обе сборки используют одинаковый make-файл, но я подумал, что стоит проверить.
Используете ли вы предварительно скомпилированные заголовки для любого из компиляторов? Если вы НЕ используете предварительно скомпилированные заголовки для VS, вы можете переключиться на их использование. Лично я бы рекомендовал использовать подход #pragma hdrstop
, а не один файл заголовка all inclusive, но если вы в настоящее время НЕ используете предварительно скомпилированные заголовки и хотите попробовать его, единственный файл заголовка all inclusive, который принудительно включенный (с помощью переключателя командной строки компилятора / FI
) можно быстро протестировать без каких-либо изменений кода.
Я писал о / FI
и #pragma hdrstop
здесь: http://www.lenholgate.com/blog/2004/07/fi-stlport- precompiled-headers-warning-level-4-and-pragma-hdrstop.html
Это не прямой ответ на вопрос, но в моей компании мы используем IncrediBuild для распределенной компиляции. Это действительно ускоряет процесс компиляции. http://incredibuild.com/visual_studio.htm
Зависимость проектов друг от друга не означает, что распараллеливание невозможно. Системы сборки достаточно умны, чтобы определять и избегать критических зависимостей, иначе gcc не смог бы использовать 4 ядра.
Итак (в дополнение к другим шагам), почему бы просто не попробовать включить многопроцессорность в Visual Studio с помощью / MP (см. http://msdn.microsoft.com/en-us/library/bb385193.aspx ).
Я написал две статьи о методах, сокращающих время компиляции. Среди этих методов есть сообщение о предварительно скомпилированном заголовке и Unity builds , которые могут помочь вам сократить время компиляции. Они поставляются со сценариями CMake, которые прозрачно обрабатывают методы.
Компилируйте и связывайте по одному файлу cpp за раз , даже если изменения файла заголовка влияют на несколько файлов cpp. Это можно сделать с помощью макроса Visual Studio:
Dim WithEvents myTimer As Timers.Timer
Sub CompileAndLinkCurrentCppFile()
DTE.ExecuteCommand("Build.Compile")
myTimer = New Timers.Timer
myTimer.Interval = 0.05
myTimer.Start()
End Sub
Sub myTimer_Elapsed(ByVal ee As Object, ByVal dd As Timers.ElapsedEventArgs) Handles myTimer.Elapsed
If DTE.Solution.SolutionBuild.BuildState <> vsBuildState.vsBuildStateInProgress And DTE.Solution.SolutionBuild.LastBuildInfo <> 1 Then
myTimer.Stop()
DTE.ExecuteCommand("Build.Link")
End If
End Sub
В книге "Large-Scale C++ Software Design" Джона Лакоса есть много советов по структурированию кода и дизайна для крупномасштабных проектов. В том числе много советов по ускорению компиляции. Книга не имеет прямого отношения к Visual C++, но прочитать ее все равно стоит.