Как улучшить время компиляции Visual C ++? - PullRequest
49 голосов
/ 12 февраля 2010

Я компилирую 2 проекта C ++ в buildbot для каждого коммита. Оба файла содержат около 1000 файлов, один - 100 клоков, другой - 170 клоков. Время компиляции сильно отличается от gcc (4.4) до Visual C ++ (2008).

Компиляции Visual C ++ для одного проекта занимают 20 минут. Они не могут использовать преимущества нескольких ядер, потому что проект зависит от другого. В конце концов, полная компиляция обоих проектов в Debug и Release в 32 и 64 битах занимает более 2,5 часов.

компиляции gcc для одного проекта занимают 4 минуты. Он может быть распараллелен на 4 ядра и занимает около 1 мин 10 сек. Все 8 сборок для 4 версий (Debug / Release, 32/64 бит) двух проектов компилируются менее чем за 10 минут.

Что происходит со временем компиляции Visual C ++? Они в основном в 5 раз медленнее.

Какое среднее время, которое можно ожидать для компиляции C ++ kloc? Мои 7 с / клок с vc ++ и 1.4 с / клок с gcc.

Можно ли что-нибудь сделать для ускорения времени компиляции в Visual C ++?

Ответы [ 12 ]

17 голосов
/ 16 февраля 2010

Одна вещь, которая замедляет компилятор VC ++, это если у вас есть заголовочный файл, который инициализирует конкретные экземпляры типов значений const, не относящихся к типу. Это может произойти с константами типа std::string или GUID. Влияет как на компиляцию, так и на время компоновки.

Для одной DLL это привело к замедлению в 10 раз. Это помогает, если вы помещаете их в предварительно скомпилированный заголовочный файл или просто объявляете их в заголовке и инициализируете их в файле cpp.

Загляните в антивирусный сканер и поэкспериментируйте с предварительно скомпилированными заголовками, без него вы не увидите VC ++ в лучшем виде.

О, да, и убедитесь, что папка% TMP% находится в том же разделе, куда записана ваша сборка, поскольку VC ++ создает временные файлы и перемещает их позже.

11 голосов
/ 12 февраля 2010

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

Итак (в дополнение к другим шагам), почему бы просто не попробовать включить многопроцессорную обработку в Visual Studio с помощью / MP (см. http://msdn.microsoft.com/en-us/library/bb385193.aspx).

6 голосов
/ 12 февраля 2010

Это не прямой ответ на вопрос, но в моей компании мы используем IncrediBuild для распределенной компиляции. Это действительно ускоряет процесс компиляции. http://incredibuild.com/visual_studio.htm

6 голосов
/ 12 февраля 2010

Как вы строите проекты Visual Studio?Вы просто запускаете ide (devenv) с проектом и /build или у вас есть make-файл, аналогичный тому, который я предполагаю, что вы используете для gcc.Я предполагаю, что обе сборки используют одинаковый make-файл, но я подумал, что стоит проверить.

Используете ли вы предварительно скомпилированные заголовки для любого компилятора?Если вы НЕ используете предварительно скомпилированные заголовки для VS, то вы можете перейти на их использование.Лично я бы порекомендовал использовать подход #pragma hdrstop, а не один заголовочный файл "все включено", но если вы в настоящее время НЕ используете предварительно скомпилированные заголовки и хотите попробовать его в единственном заголовочном файле "все включено", который принудительно включен (используя /FI переключатель командной строки компилятора) может быть быстро протестирован без каких-либо изменений кода.

Я писал о /FI и #pragma hdrstop здесь: http://www.lenholgate.com/blog/2004/07/fi-stlport-precompiled-headers-warning-level-4-and-pragma-hdrstop.html

3 голосов
/ 05 августа 2010

В книге Джона Лакоса «Разработка программного обеспечения для крупномасштабного C ++» есть много советов по структурированию вашего кода и дизайна для крупномасштабных проектов. Включая много советов по ускорению компиляции. Не имеет прямого отношения к Visual C ++, но в любом случае стоит прочитать.

2 голосов
/ 21 февраля 2010

Я написал две статьи о методах, которые сокращают время компиляции. Среди этих приемов пост о предварительно скомпилированных заголовках и unity строит , что может помочь вам улучшить время компиляции. Они поставляются со скриптами CMake, которые прозрачно обрабатывают методы.

1 голос
/ 12 февраля 2010

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

Вы можете создать несколько статических библиотек. Поместите код, который редко изменяется в библиотеки.

Самые медленные части построения программы:

  1. Открытие и закрытие файлов.
  2. Разбор и перевод источника файлы.

Как правило, этапы компоновки и создания исполняемого файла самые быстрые.

Вы определили:

  1. какие фазы самые медленные?
  2. Какие файлы медленнее всего компилировать?

Помните, что при определении эффективности всегда указывайте профиль (так или иначе).

1 голос
/ 12 февраля 2010

Прежде всего, в большинстве случаев вы можете создавать отладочные и выпускать конфигурации одного и того же проекта параллельно.

Также то, что вы описываете, звучит ужасно медленно - похоже, вы не используете предварительно скомпилированные заголовки в VC ++ или используете их неправильно - они специально предназначены для сокращения времени компиляции.

0 голосов
/ 25 октября 2010

Не знаю, является ли это все еще проблемой, и насколько вы улучшились в menatime, но если он все еще остается в силе, msbuild не знает, как организовать одновременно в одном проекте (каждый cpp должен быть отдельно собран, если вы есть некоторые кодены - кодены лучше всего переносить в отдельный проект) вам нужно скачать комплект разработки драйверов или .NET SSCLI , поскольку у них обоих есть nmake, сборка которого, как известно, хорошо парализует вещи. В SSCLI уже была настроена сборка сборки, не помню, есть ли у DDK примеры сборки, нужно ли начинать с нуля.

Также немного устаревшая статья о параллелизме MSBuild не вдавается в детали, но упоминает некоторые различия между фактическим msbuild и msbuild + sln. Если / MP против / Gm была единственной проблемой, то вам, возможно, придется сделать небольшой скрипт или C # exe для редактирования файлов .proj для лабораторной сборки. Или используйте явное переопределение строки cmd в проектах и ​​используйте эту опцию из переменной env.

0 голосов
/ 27 февраля 2010

Компиляция и компоновка одного файла 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
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...