Doxygen es lento

Doxygen tarda aproximadamente 12 horas en ejecutarse en nuestra base de códigos. Esto se debe principalmente a que hay que procesar un gran número de código (~ 1.5M líneas). Sin embargo, se está acercando al punto en el que no podemos hacer actualizaciones de documentación todas las noches porque tardan demasiado. Ya hemos tenido que reducir la profundidad del gráfico para reducirlo a 12 horas.

Probé los enfoques estándar, pero realmente necesito resultados de alta calidad, y esto incluye gráficos y SEARCH_INCLUDES. Tengo una máquina bastante buena para ejecutar Doxygen, pero Doxygen no aprovecha sus muchos núcleos. (Vincula una única CPU en el servidor de comstackción, pero es solo el 4% del sistema disponible.) Tener una creación de subprocesos de punto es útil, aunque eso es solo la mitad del tiempo de comstackción.

¿Hay alguna técnica que pueda usar para ejecutar doxygen a través de procesos múltiples y fragmentar manualmente la tarea? He visto hablar sobre crear archivos de tags, pero no entiendo lo suficiente sobre ellos para saber si harían lo que quisiera. Lo que estoy buscando es algo así como:

doxygen Doxyfile-folder1 doxygen Doxyfile-folder2 doxygen Doxyfile-folder3 doxygen Doxyfile-folder4 doxygen-join output/folder1/html output/folder2/html output/folder3/html output/folder4/html 

Por supuesto, solo estoy inventando cosas, pero esa es una idea de lo que estoy buscando. Además, usaría mucho más de 4 procesos.

Los archivos de tags suelen ser el camino a seguir si

  1. tiene una cantidad de archivos fuente lógicamente coherentes (llamémoslos componentes) y
  2. usted conoce las dependencias entre los componentes, por ejemplo, el componente A usa los componentes B y C, y el componente B solo usa C, y
  3. Está bien (o incluso preferido) que los archivos de índice (por ejemplo, la lista de archivos / clases / funciones) estén limitados a un único componente.
  4. usted está interesado en la salida de HTML.

Un archivo de etiqueta es básicamente una lista estructurada de símbolos con enlaces a la ubicación en la documentación. Los archivos de etiqueta permiten a doxygen hacer enlaces desde la documentación de un componente a la de otro.

Es un proceso de 2 pasos:

  1. Primero ejecuta doxygen en cada componente para generar el archivo de etiqueta para ese componente. Puede hacer esto deshabilitando todos los resultados y usar GENERATE_TAGFILE. Entonces, para el componente A, un Doxyfile.tagonly tendría la siguiente configuración:

     GENERATE_HTML = NO GENERATE_LATEX = NO GENERATE_RTF = NO GENERATE_MAN = NO GENERATE_TAGFILE = compA.tag 

    Notarás que ejecutar doxygen de esta manera es muy rápido.

  2. El segundo paso es generar la documentación real. Para el componente A necesita un Doxyfile que incluye los archivos de etiqueta de los componentes B y C, ya que determinamos que A depende de estos componentes.

     GENERATE_HTML = YES GENERATE_LATEX = NO GENERATE_RTF = NO GENERATE_MAN = NO TAGFILES = path/to/compB/compB.tag=path/to/compB/htmldocs \ path/to/compC/compC.tag=path/to/compC/htmldocs 

Usando este enfoque, pude generar documentación para más de 20 millones de líneas distribuidas en más de 1500 componentes en menos de 3 horas en una PC de escritorio estándar (Core i5 con 8 Gb de RAM y Linux de 64 bits), incluyendo exploración de fonts, gráficos de llamadas completas y UML diagtwigs de estilo de todas las estructuras de datos. Tenga en cuenta que el primer paso solo tomó 10 minutos.

Para lograr esto hice una secuencia de comandos para generar los archivos de Doxy para cada componente en función de la lista de componentes y sus dependencias directas. En el primer paso, ejecuto 8 instancias de doxygen en paralelo (utilizando http://www.gnu.org/s/parallel/ ). En el segundo paso, ejecuto 4 instancias de doxygen en paralelo.

Consulte http://www.doxygen.org/external.html para obtener más información sobre los archivos de tags.

    Intereting Posts