Как найти узкие места компиляции?
Как определить, какие части кода занимают много времени?
Я уже использую предварительно скомпилированные заголовки для всех своих заголовков, и они определенно улучшают скорость компиляции. Тем не менее, всякий раз, когда я вношу изменения в свой исходный файл на С++, компиляция занимает много времени (это связано с ЦП/памятью, а не с протоколом ввода-вывода - все кэшировано). Кроме того, это не связано с частью связывания, просто частью компиляции.
Я попытался включить /showIncludes
, но, конечно, поскольку я использую предварительно скомпилированные заголовки, после stdafx.h
ничего не включается. Поэтому я знаю, что только исходный код требует времени для компиляции, но я не знаю, какая его часть.
Я также пытался сделать минимальную сборку, но это не помогает. Также не существует /MP
, потому что это единственный исходный файл.
Я мог бы попытаться проанализировать исходный код и выяснить, какая часть является узким местом, добавив/удалив его, но это боль и не масштабируется. Кроме того, трудно удалить что-то и допустить компиляцию кода - сообщения об ошибках, если они есть, возвращаются почти сразу.
Есть ли лучший способ выяснить, что замедляет компиляцию?
Или, если нет способа: существуют ли какие-либо языковые конструкции (например, шаблоны?), которые занимают намного больше времени для компиляции?
Что я имею в своем исходном коде на С++:
-
Три (относительно больших) диалоговых класса ATL (включая определения/логику).
Они вполне могут быть причиной, но в любом случае они являются основной частью программы, поэтому, очевидно, их нужно перекомпилировать, когда я их меняю.
-
Случайные однострочные (или аналогично малые) функции полезности, например. конвертер byte-array-to-hex
-
Ссылки на (встроенные) классы, найденные внутри моих файлов заголовков. (Один из файлов заголовков является гигантским, но он использует только минимальные шаблоны и, конечно, предварительно скомпилирован. Другой - TR1 regex
- он огромный, но он почти не используется.)
Примечание:
Я ищу методы , которые я могу применить в общих чертах, чтобы выяснить причину этих проблем, не конкретные рекомендации для моей конкретной ситуации. Надеюсь, это было бы более полезно и для других людей.
Ответы
Ответ 1
Два общих способа улучшить время компиляции:
- вместо включения заголовков в заголовках, используйте forward declare (включите заголовки только в исходные файлы).
- свести к минимуму шаблонный код (если вы не можете использовать шаблоны)
Только эти два правила значительно улучшат время сборки.
Вы можете найти больше трюков в "Масштабном программном обеспечении на С++" от Lakos.
Для визуальной студии (я не уверен, что она слишком старая), взгляните на это: Как я могу обнаружить ненужные файлы #include в большом проекте на С++?
Ответ 2
Код шаблона обычно занимает больше времени для компиляции.
Вы можете исследовать использование "компиляторных брандмауэров", которые уменьшают частоту .cpp файла, который нужно построить (они могут сократить время для чтения включенных файлов, а также из-за форвардных объявлений).
Вы также можете переключать время, затрачиваемое на создание кода от компилятора до компоновщика, используя генерацию кода времени и/или оптимизацию всей программы, хотя обычно вы теряете время в конечном итоге.