Doxygen很慢

时间:2011-11-23 18:20:26

标签: multithreading performance multiprocessing doxygen

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个进程。

1 个答案:

答案 0 :(得分:53)

标记文件通常是

的方法
  1. 你有许多逻辑上连贯的源文件(我们称之为组件)和
  2. 你知道组件之间的依赖关系,例如组件A使用组件B和C,组件B仅使用C和
  3. 索引文件(例如文件/类/函数列表)仅限于一个组件,这是可以的(甚至是首选的)。
  4. 您对HTML输出感兴趣。
  5. 标签文件基本上只是一个结构化的符号列表,其中包含指向文档中位置的链接。标记文件允许doxygen从一个组件的文档到另一个组件的文档链接。

    这是一个两步过程:

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

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

      你会注意到以这种方式运行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
      
    3. 使用这种方法,我已经能够在标准台式PC(具有8Gb RAM和Linux 64位的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