Как сократить время компиляции с Boost Asio - PullRequest
3 голосов
/ 13 февраля 2010

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, когда могу.

Ответы [ 4 ]

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

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

1 голос
/ 20 сентября 2011

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

http://www.cygnus -software.com / документы / precompiledheaders.html

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

1 голос
/ 10 июня 2010

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

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

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

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...