Как найти узкие места компиляции? - PullRequest
13 голосов
/ 12 ноября 2011

Как мне найти, какие части кода занимают много времени для компиляции?

Я уже использую предварительно скомпилированные заголовки для всех моих заголовков, и они определенно улучшают скорость компиляции. Тем не менее, когда бы я ни вносил изменения в мой исходный файл C ++, его компиляция занимает много времени (это связано с CPU / памятью, не I / O-привязано - все это кэшируется). Кроме того, это не относится к части связывания, только к части компиляции.

Я пытался включить /showIncludes, но, конечно, поскольку я использую предварительно скомпилированные заголовки, после stdafx.h ничего не включается. Так что я знаю, что для компиляции требуется только исходный код, но я не знаю, какая его часть.

Я также пытался сделать минимальную сборку, но это не помогает. Ни один не делает /MP, потому что это все равно один исходный файл.

Я мог бы попытаться разобрать исходный код и выяснить, какая часть является узким местом, добавляя / удаляя его, но это боль и не масштабируется. Кроме того, трудно что-то удалить и все же позволить скомпилировать код - сообщения об ошибках, если таковые имеются, возвращаются почти немедленно.

Есть ли лучший способ выяснить, что замедляет компиляцию?

Или, если нет способа: существуют ли языковые конструкции (например, шаблоны?), Которые компилируются намного дольше?


Что у меня есть в исходном коде C ++:

  • Три (относительно больших) диалоговых класса ATL (включая определения / логику).

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

  • Случайные однострочные (или аналогично малые) вспомогательные функции, например, преобразователь байтового массива в шестнадцатеричный

  • Ссылки на (встроенные) классы, найденные в моих заголовочных файлах. (Один из заголовочных файлов гигантский, но он использует шаблоны только минимально, и, конечно, он предварительно скомпилирован. Другой - TR1 regex - он огромный, но почти не используется.)

Примечание:

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

Ответы [ 2 ]

3 голосов
/ 12 ноября 2011

Два основных способа улучшить время компиляции:

  • вместо того, чтобы включать заголовки в заголовки, используйте предварительное объявление (включайте заголовки только в исходные файлы)
  • свести к минимуму шаблонный код (если вы можете избежать использования шаблонов)

Только эти два правила значительно улучшат ваше время сборки.

Вы можете найти больше трюков в «Крупномасштабном программном обеспечении C ++» Лакоса.

Для visual studio (я не уверен, что он слишком старый), взгляните на это: Как мне обнаружить ненужные файлы #include в большом проекте C ++?

1 голос
/ 13 ноября 2011

Шаблонный код обычно компилируется дольше.

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

Вы также можете перенести время, потраченное на генерацию кода, с компилятора на компоновщик с помощью генерации кода Link-Time и / или оптимизации всей программы, хотя обычно выпотерять время в долгосрочной перспективе.

...