Skip to main content
 首页 » 编程设计

multithreading之Doxygen 很慢

2024年11月24日14softidea

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 

当然,我只是在编造东西,但这就是我正在寻找的想法。另外,我会使用超过 4 个进程。

请您参考如下方法:

标签文件通常是要走的路,如果

  • 您有许多逻辑连贯的源文件(我们称它们为组件)和
  • 您知道组件之间的依赖关系,例如组件A使用组件B和C,组件B只使用C,
  • 可以(甚至更喜欢)索引文件(例如文件/类/函数的列表)仅限于单个组件。
  • 您对 HTML 输出感兴趣。

  • 标签文件基本上只是一个结构化的符号列表,带有指向文档中位置的链接。标签文件允许 doxygen 将一个组件的文档链接到另一个组件的文档。

    这是一个 2 步过程:
  • 首先在每个组件上运行 doxygen 以生成该组件的标记文件。您可以通过禁用所有输出并使用 GENERATE_TAGFILE 来做到这一点。因此,对于组件 A,Doxyfile.tagonly 将具有以下设置:
    GENERATE_HTML         = NO 
    GENERATE_LATEX        = NO 
    GENERATE_RTF          = NO 
    GENERATE_MAN          = NO 
    GENERATE_TAGFILE      = compA.tag 
    

    您会注意到以这种方式运行 doxygen 非常快。
  • 第二步是生成实际文档。对于组件 A,您需要一个 Doxyfile,其中包含组件 B 和 C 的标记文件,因为我们确定 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 
    

  • 使用这种方法,我能够在 3 小时内在标准台式 PC(具有 8Gb RAM 和 Linux 64 位的 Core i5)上为分布在 1500 多个组件上的 2000 多行代码生成文档,包括源浏览、完整调用图和 UML所有数据结构的样式图。请注意,第一步只用了 10 分钟。

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

    http://www.doxygen.nl/manual/external.html有关标签文件的更多信息。