Как улучшить время компиляции Visual C++?

Я компилирую 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++?

49
задан Didier Trosset 12 February 2010 в 01:14
поделиться

11 ответов

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

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

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

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

17
ответ дан 7 November 2019 в 11:55
поделиться

Кажется очень странным, что существует такая разница ... но также нет причин, по которым вы не можете воспользоваться преимуществами многоядерных процессоров Visual!

В основном у вас есть 4 режима компиляции: (Отладка / Выпуск) x (32 бита / 64 бита), каждый из которых полностью независим от другого, вы можете отлично запустить 4 параллельно, используя все преимущества 4 доступных ядер. Или просто попробуйте многопроцессорный подход в Visual Studio.

Однако это никуда не годится. 150 минут против 10 минут - огромный разрыв. По моему личному опыту, есть 2 основных фактора сокращения времени компиляции:

  • использование всех файлов на локальном диске (при необходимости с использованием репликации с удаленных дисков) и всех файлов, созданных локально (.o .so)
  • , использование все ядра в вашем распоряжении, и, если можете, даже используйте Multi Machines (distcc и т. д.)
0
ответ дан 7 November 2019 в 11:55
поделиться

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

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

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

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

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

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

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

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

1
ответ дан 7 November 2019 в 11:55
поделиться

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

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

1
ответ дан 7 November 2019 в 11:55
поделиться

Вы строите на одной машине? Вы используете ту же ОС? Я видел разницу в скорости в районе 3-10x при сравнении GCC в Cygwin и GCC на машине VirtualBox, работающей внутри Windows, на которой размещен Cygwin.

0
ответ дан 7 November 2019 в 11:55
поделиться

Как вы строите проекты 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

6
ответ дан 7 November 2019 в 11:55
поделиться

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

6
ответ дан 7 November 2019 в 11:55
поделиться

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

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

11
ответ дан 7 November 2019 в 11:55
поделиться

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

2
ответ дан 7 November 2019 в 11:55
поделиться

Компилируйте и связывайте по одному файлу 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
0
ответ дан 7 November 2019 в 11:55
поделиться

В книге "Large-Scale C++ Software Design" Джона Лакоса есть много советов по структурированию кода и дизайна для крупномасштабных проектов. В том числе много советов по ускорению компиляции. Книга не имеет прямого отношения к Visual C++, но прочитать ее все равно стоит.

3
ответ дан 7 November 2019 в 11:55
поделиться
Другие вопросы по тегам:

Похожие вопросы: