Подтвердить что ты не робот

Как найти узкие места компиляции?

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

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

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

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

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

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

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


Что я имею в своем исходном коде на С++:

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

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

  • Случайные однострочные (или аналогично малые) функции полезности, например. конвертер byte-array-to-hex

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

Примечание:

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

4b9b3361

Ответ 1

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

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

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

Вы можете найти больше трюков в "Масштабном программном обеспечении на С++" от Lakos.

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

Ответ 2

Код шаблона обычно занимает больше времени для компиляции.

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

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