2011-11-23 20 views
23

Doxygen tarda aproximadamente 12 horas en ejecutarse en nuestro código base. 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.Doxygen es lento

He intentado con 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 compilació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 compilació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 etiquetas, 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, sólo estoy inventando cosas, pero eso es una idea de lo que estoy buscando. Además, usaría mucho más de 4 procesos.

+0

¿El servidor tiene suficiente RAM para mantener la base de código en caché y ejecutar doxygen sin intercambio? – mpartel

+2

Más memoria RAM y/o disco duro más rápido. Elige un disco SSD de 80 GB y pon tu código en eso. El software que es IO intensivo se beneficiará tremendamente de un disco duro moderno de estado sólido. –

+1

Bueno, actualmente se encuentra en un conjunto de 10 unidades de RAID, por lo que no debería ser tan lento ... – alficles

Respuesta

50

archivos de etiquetas suelen ser el camino a seguir si

  1. usted tiene un número 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 único componente.
  4. le interesa la salida HTML.

Un archivo de etiqueta es básicamente una simple 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 se ejecuta doxygen en cada componente para generar el fichero de etiquetas para ese componente. Puede hacer esto deshabilitando todos los resultados y usar GENERATE_TAGFILE. Así que para el componente A, un Doxyfile.tagonly tendría los siguientes valores:

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

    Se dará cuenta de que la ejecución de 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 
    

uso de este enfoque he sido capaz de generar documentación de 20M + líneas de código distribuidos sobre 1500+ componentes en menos de 3 horas en un PC de escritorio estándar (i5 Core con 8 GB de RAM y 64 bits Linux), incluida la exploración de fuentes, gráficos de llamadas completas y diagramas de estilo UML 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 Doxyfile 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 (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.

+0

No estoy seguro de lo que era antes, pero con Doxygen 1.8.2 Tengo que establecer 'GENERATE_HTML = SÍ' al generar el archivo de etiqueta (la compilación "maestra" no genera documentación HTML para los proyectos vinculados). –

+2

@doxygen - En la documentación de Doxygen, los archivos de etiqueta se introducen en "Enlace a documentación externa" (http://www.doxygen.org/external.html). Si bien ese parece ser el objetivo inicial, los archivos de etiquetas también se pueden usar de otra forma, p. múltiples proyectos relacionados (internos), según la respuesta anterior. De ser así, será útil si la documentación se actualiza en consecuencia, para las personas que buscan organizar y/u optimizar mejor su documentación. – amolbk

+0

¿Puedes elaborar sobre la "secuencia de comandos para generar los archivos Doxy para cada componente en función de la lista de componentes y sus dependencias directas"? – spy