multithreading performance multiprocessing doxygen

multithreading - Doxygen es lento



performance multiprocessing (1)

Los archivos de etiquetas suelen ser el camino a seguir si

  1. tiene una serie de archivos de origen lógicamente coherentes (llamémosles componentes) y
  2. 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 solo componente.
  4. Usted está interesado en la salida 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 etiquetas permiten a doxygen crear enlaces desde la documentación de un componente hasta el de otro.

Es un proceso de 2 pasos:

  1. Primero ejecuta doxygen en cada componente para generar el archivo de etiqueta para ese componente. Puedes hacer esto deshabilitando todos los resultados y usa GENERATE_TAGFILE. Así que para el componente A, un archivo Doxy.archivo tendría las siguientes configuraciones:

    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 archivo Doxy que incluya los archivos de etiquetas 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

Con este enfoque, he podido generar documentación para más de 20M de líneas de código distribuidas en más de 1500 componentes en menos de 3 horas en una PC de escritorio estándar (Core i5 con 8Gb RAM y Linux de 64 bits), incluida la búsqueda de fuentes, gráficos de llamadas completos y UML Diagramas de estilo de todas las estructuras de datos. Tenga en cuenta que el primer paso sólo tomó 10 minutos.

Para lograr esto, hice un script para generar el Doxyfile para cada componente basado en la lista de componentes y sus dependencias directas. En el primer paso ejecuto 8 instancias de doxygen en paralelo (usando 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 etiquetas.

Doxygen tarda aproximadamente 12 horas en ejecutarse en nuestro código base. Esto se debe principalmente a que hay mucho código para procesar (~ 1,5 millones de líneas). Sin embargo, se está acercando muy rápidamente al punto en el que no podemos hacer actualizaciones de la documentación cada noche porque llevan demasiado tiempo. Ya hemos tenido que reducir la profundidad del gráfico para reducirlo a 12 horas.

He intentado 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. (Asigna una sola CPU al servidor de compilación, pero es solo el 4% del sistema disponible). Tener una compilación de puntos multiproceso es útil, aunque eso es solo la mitad del tiempo de compilación.

¿Hay alguna técnica que pueda usar para ejecutar doxygen a través de múltiples procesos y fragmentar manualmente la tarea? He visto hablar sobre la creación de archivos de etiquetas, pero no entiendo lo suficiente sobre ellos para saber si harían lo que yo quisiera. Lo que busco es algo 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.