Doxygen很慢

alf*_*les 24 performance multithreading doxygen multiprocessing

Doxygen在我们的代码库上运行大约需要12个小时.这主要是因为要处理的代码很多(~1.5M行).但是,它很快就会达到我们无法进行夜间文档更新的程度,因为它们需要太长时间.我们已经不得不减少图表深度,使其降至12小时.

我已经尝试过标准方法,但我确实需要高质量的输出,这包括图形和SEARCH_INCLUDES.我有一个相当不错的机器来运行Doxygen,但Doxygen没有利用它的许多核心.(它与构建服务器上的单个CPU挂钩,但只占可用系统的4%.)具有多线程Dot构建非常方便,但这只是构建时间的一半左右.

是否有任何技术可用于通过多个进程运行doxygen并手动分割任务?我已经看过一些关于创建标记文件的讨论,但我不太了解他们是否知道他们是否按照我的意愿行事.我正在寻找的是:

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
Run Code Online (Sandbox Code Playgroud)

当然,我只是制作东西,但这是我想要的东西的想法.此外,我使用了超过4个进程.

dox*_*gen 54

标记文件通常是这样的方式

  1. 你有许多逻辑上连贯的源文件(让我们称之为组件)和
  2. 你知道组件之间的依赖关系,例如组件A使用组件B和C,组件B只使用C,和
  3. 索引文件(例如文件/类/函数列表)仅限于单个组件是可以的(甚至是首选的).
  4. 你对HTML输出感兴趣.

标记文件基本上只是一个结构化的符号列表,其中包含指向文档中位置的链接.标记文件允许doxygen从一个组件的文档到另一个组件的文档进行链接.

这是一个两步过程:

  1. 首先,在每个组件上运行doxygen,以生成该组件的标记文件.您可以通过禁用所有输出并使用GENERATE_TAGFILE来执行此操作.因此,对于组件A,Doxyfile.tagonly将具有以下设置:

    GENERATE_HTML         = NO
    GENERATE_LATEX        = NO
    GENERATE_RTF          = NO
    GENERATE_MAN          = NO
    GENERATE_TAGFILE      = compA.tag
    
    Run Code Online (Sandbox Code Playgroud)

    你会注意到以这种方式运行doxygen 非常快.

  2. 第二步是生成实际文档.对于组件A,您需要一个包含组件B和C的标记文件的Doxyfile,因为我们确定A取决于这些组件.

    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
    
    Run Code Online (Sandbox Code Playgroud)

使用这种方法,我已经能够在标准桌面PC(具有8Gb RAM和Linux 64bit的Core i5)上在3小时内生成分布在1500多个组件上的20M +代码行的文档,包括源浏览,完整调用图和UML所有数据结构的样式图.请注意,第一步只需要10分钟.

为了实现这一点,我创建了一个脚本,根据组件列表及其直接依赖关系为每个组件生成Doxyfile.在第一步中,我并行运行了8个doxygen实例(使用http://www.gnu.org/s/parallel/).在第二步中,我并行运行4个doxygen实例.

有关标记文件的更多信息,请参见http://www.doxygen.nl/manual/external.html.

  • @doxygen - 在Doxygen文档中,标记文件在"链接到外部文档"(http://www.doxygen.org/external.html)中引入.虽然这似乎是最初的目的,但标签文件也可以使用,例如多个相关(内部)项目,如上面的答案.如果是这样,那么对于希望更好地组织和/或优化其文档的人来说,如果相应地更新文档将会有所帮助. (2认同)