Кислород медленный - PullRequest
       7

Кислород медленный

24 голосов
/ 23 ноября 2011

Doxygen требуется около 12 часов для работы с нашей кодовой базой. Это в первую очередь потому, что для обработки требуется много кода (~ 1,5 млн строк). Тем не менее, он очень быстро приближается к тому моменту, когда мы не можем делать ночные обновления документации, потому что они занимают слишком много времени. Нам уже пришлось уменьшить глубину графика до 12 часов.

Я пробовал стандартные подходы, но мне действительно нужно высокое качество вывода, включая графы и SEARCH_INCLUDES. У меня есть довольно хорошая машина для запуска Doxygen, но Doxygen не использует преимущества своих многочисленных ядер. (Он привязывает один процессор к серверу сборки, но составляет всего 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 Ответ

53 голосов
/ 23 ноября 2011

Файлы тегов обычно подходят, если

  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 вам нужен Doxy-файл, который включает файлы тегов компонентов 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
    

Используя этот подход, я смог сгенерировать документацию для 20M + строк кода, распределенных по 1500+ компонентам, менее чем за 3 часа на стандартном настольном ПК (Core i5 с 8Gb RAM и Linux 64bit), включая просмотр исходных кодов, полные графики вызовов и диаграммы в стиле UML для всех структур данных. Обратите внимание, что первый шаг занял всего 10 минут.

Для этого я создал скрипт для генерации Doxy-файла для каждого компонента на основе списка компонентов и их прямых зависимостей. На первом шаге я параллельно запускаю 8 экземпляров doxygen (используя http://www.gnu.org/s/parallel/). На втором шаге я параллельно запускаю 4 экземпляра doxygen.

Подробнее о файлах тегов см. http://www.doxygen.nl/manual/external.html.

...