2011-11-23 49 views
23

Doxygen大约需要12个小时才能运行在我们的代码库上。这主要是因为有很多代码需要处理(大约150万行)。但是,它很快接近我们无法进行夜间文档更新的时间点,因为它们需要很长时间。我们已经不得不减少图表深度,将其降低到12小时。Doxygen很慢

我试过标准方法,但我确实需要高质量的输出,这包括图表和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个以上的进程。

+0

服务器是否有足够的RAM来保持整个代码库的缓存并运行doxygen而不进行交换? – mpartel

+2

更多内存和/或更快的硬盘。拿起一个80 GB的固态硬盘,并把你的代码。 IO密集型软件将从现代固态硬盘中获益匪浅。 –

+1

那么,它目前坐在10k驱动器的RAID 10阵列上,所以它不应该那么慢... – alficles

回答

50

标记文件通常是路要走

  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 
    

    你会发现,运行doxygen的这种方式是非常快速

  2. 第二步是生成实际的文档。对于组件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 
    

使用这种方法我已经能够产生分布在1500多个部件在不到3小时的标准台式PC上的代码20M +线文档(酷睿i5与8GB的内存和Linux 64位),包括源浏览,完整调用图和所有数据结构的UML风格图。请注意,第一步只需要10分钟。

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

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

+0

我不确定它是什么,但是用Doxygen 1.8.2我需要设置'GENERATE_HTML =生成标记文件时为“YES”(“主”版本不会为链接的项目生成HTML文档)。 –

+2

@doxygen - 在Doxygen文档中,标签文件在“链接到外部文档”(http://www.doxygen.org/external.html)中介绍。虽然这似乎是最初的目的,但标签文件也可以使用,例如,根据上面的答案,多个相关(内部)项目。如果是这样,这将有助于文档相应更新,以便希望更好地组织和/或优化其文档的人员。 – amolbk

+0

您能否详细说明“基于组件列表及其直接依赖关系为每个组件生成Doxyfile的脚本”? – spy