Как сократить время компиляции с помощью Boost Asio

Boost.Asio - отличная библиотека, но у нее есть один огромный недостаток - медленное время компиляции. Простая реализация (действительно простая) протокола HTTP (около 1 тыс. Строк кода) требует около 13,5 с для компиляции под GCC 4.4!

Я попытался использовать PCH, но он не улучшает время компиляции слишком много (около 1 с).

Итак, есть ли какие-либо уроки о том, как быстрее выполнять компиляцию Boost.Asio?

Например, какие заголовки я должен точно указать для какого класса.

Я использую например: io_service, tcp::ip::sockets, tcp::ip::acceptor, deadline_timer, буферы и несколько функций, таких как async_read, async_write.

Любые предложения?

P.S.: Я использую pimpl, когда могу.

Ответы

Ответ 1

Какая платформа? В Linux обе ccache и distcc являются удивительными, включенными в большинство дистрибутивов и оснасткой для настройки, индивидуально или даже комбинированными.

Ответ 2

  • Используете ли вы boost::lambda или boost::bind для создания обработчиков завершения? boost::bind менее сложный = > быстрее компилируется.
  • Вы можете профилировать компилятор с помощью #pragma message(), чтобы узнать, требуется ли это # ​​include-ing или фактическая компиляция, которая требует времени. Я использовал это с MSVS, чтобы увидеть, что иногда большинство времени компиляции предшествует любому коду в .cpp, а иногда и чаще, в основном после. Это может помочь вам профилировать производительность вашего компилятора. (Но если препроцессор /# включен быстро и запускается раньше всего, это не даст вам многого)

Ответ 3

Хорошо, вы, наверное, решили это давно. Но на всякий случай.

Предварительно скомпилированные заголовки не волшебным образом улучшают время компиляции. Они улучшают время перекрестного перевода, кэшируя первую оценку заголовка. Таким образом, вы не увидите преимущества, если вы не используете #include ASIO для нескольких исходных файлов. Любые новые экземпляры шаблонов будут в дальнейшем сделать это последнее преимущество еще менее заметным.

Я предлагаю изолировать ASIO к одному исходному файлу. Не включайте ASIO в любые файлы заголовков "без деталей". Если вы должны сделать последнее, попробуйте скрыть его, используя шаблон Pimpl.

Если вы нуждаетесь в функциональности ASIO в нескольких исходных файлах, подумайте о создании уровня абстракции между вашим кодом и ASIO. Если вы сохраните его как можно проще, убедитесь, что код моста никогда не изменяется, тогда вы можете даже #include использовать этот интерфейс в PCH.

Ответ 4

Мы используем boost thread, asio и несколько других libs, включая Qt. Использование предварительно скомпилированных заголовков тщательно делало улучшение времени сборки на 10: 1. Мы указали следующее для руководства:

http://www.cygnus-software.com/papers/precompiledheaders.html

Есть способы делать precomiled заголовки, чтобы они не ползали в каждый файл и не подтверждали ваш код.