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

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 ответ

Файлы тегов, как правило, способ пойти, если

  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 с 8 ГБ ОЗУ и Linux 64bit), включая просмотр исходного кода, полные графики вызовов и UML. диаграммы всех структур данных. Обратите внимание, что первый шаг занял всего 10 минут.

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

Смотрите http://www.doxygen.org/external.html для получения дополнительной информации о файлах тегов.

Другие вопросы по тегам