2010-02-13 2 views
3

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

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

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

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

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

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

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

ответ

4

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

+0

Перекрестная платформа для любого компилятора. Также я хочу чистое решение на C++. – Artyom

+3

Хорошо, что заставляет вас думать, что есть ускорение, которое разработчики Boost оставили на столе? –

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

Я использую 'boost :: bind', а не' boost :: lambda' – Artyom

1

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

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

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

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

1

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

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

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

 Смежные вопросы

  • Нет связанных вопросов^_^