2011-02-17 14 views
11

Estoy usando Boost Program Options, y tarda bastante tiempo (10 segundos o incluso más) en compilar código C++ muy pequeño con él. Tomó 1 segundo compilar el código sin la biblioteca de impulso.Acelerar el tiempo de compilación/enlace al usar las bibliotecas de impulso

¿Alguna idea de cómo aumentar el tiempo de compilación/enlace con la biblioteca de impulso? Es multiplataforma, por lo que necesito compilar el código con Mac OS X/Linux/PC.

+1

Algunas partes de boost son muy útiles. Sin embargo, muchos componentes me parecen demasiado ingeniosos y tienen terribles dependencias de encabezado solo porque se implementan solo en encabezados. Así que terminas recompilando código de refuerzo innecesariamente una y otra vez, mientras que una biblioteca estática o compartida funcionaría muy bien. –

+1

Casi cualquier compilador que sea lo suficientemente moderno para compilar Boost también admite encabezados precompilados. Esas son conceptualmente el equivalente de las bibliotecas estáticas para las bibliotecas de solo encabezado. – MSalters

+0

ver aquí, http://www.boost.org/boost-build2/doc/html/bbv2/reference/precompiled_headers.html – Dilawar

Respuesta

15

En realidad no hay mucho que se pueda hacer más allá de los trucos habituales:

  • minimizar dependencias: se descargue sólo las cabeceras de Boost que realmente necesita, y el uso de cabeceras lo más específico posible (muchas bibliotecas tienen un único cabecera "master", como boost/thread.hpp, sino también un subdirectorio con cabeceras específicas, como boost/thread/shared_mutex.hpp),
  • cuando sea posible, se basan en las declaraciones hacia adelante en lugar de la inclusión de toda la cabecera,
  • si es posible, incluyen la cabecera sólo en una .cpp archivo. Si lo incluye en un encabezado, debe compilarse cada vez que se compila una unidad de traducción que incluye ese encabezado. Como regla general, intente minimizar la cantidad de código que tiene en los encabezados,
  • , todos los compiladores principales admiten encabezados precompilados. Utilícelos para reducir el tiempo de compilación,
  • experimente con unity builds. Eso puede o no ser una ventaja en su caso.

Y por último, pero no menos importante, la última opción es simplemente no usar esas bibliotecas específicas de Boost.

A veces uso ciertas bibliotecas de Boost desde el principio, por conveniencia, y si el tiempo de compilación es demasiado malo, empiezo a buscar qué bibliotecas son caras de compilar y cuáles pueden reemplazarse por un código relativamente simple. A menudo, Boost está estorbado por el requisito de ser tan general. Si no necesita algo que funcione en compiladores de 8 años, o que no tenga que funcionar en muchos tipos diferentes, entonces puede escribir un reemplazo simple que funcione para usted, y no le tome casi tiempo compilar.

+0

¿quiere decir que el tiempo de compilación es más valioso que volver a implementar casi siempre bibliotecas de Boost muy buenas? ¿Qué hay de comprar una buena CPU y disco SSD? Además, su recomendación de usar encabezados precompilados reduce este problema en ~ 80% en promedio. Creo que es casi el último que lista porque no es compatible con todos los compiladores, solo por todos los populares. 'Boost Program Options 'se usa normalmente si su programa requiere una entrada más sofisticada que solo" arg1 arg2 ". En este caso, volver a implementarlo sería una opción realmente lenta. –

+0

@Andy: no, dije que es * una * opción que podría considerar en * algunos * casos. – jalf

1

Tuve un buen éxito con el compiler firewall idiom para reducir los tiempos de compilación.

+1

AKA Pimpl modismo. Pimpl es realmente bueno cuando la implementación tiene dependencias extrañas/inusuales/costosas (como bibliotecas de terceros que no necesitas/quieres exponer en la API de la clase).Pero tenga en cuenta que incurre en costos, tanto en términos de otra instancia de clase (a menudo asignada dinámicamente) para la instancia de Pimpl como de complejidad en el código ya que la mayoría de las API de la clase se reenviarán a la clase Pimpl de alguna manera. – Meros

Cuestiones relacionadas