Как сократить время компиляции с 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,

Какие-либо предложения?

PS: я использую pimpl, когда могу.

4 ответа

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

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

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

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

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

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

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

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

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

Другие вопросы по тегам