Повторный анализ с кэшем

В большинстве случаев проект анализируется регулярно. При этом анализ запускается после относительно незначительных изменений анализируемого кода. С целью ускорить повторный анализ слегка изменённого кода мы разрабатываем новый режим анализа, использующий кэш. Данный режим будет доступен в svace 3.3.0.

Основная идея

Анализ был разделён на компоненты, которые получают входные данные и возвращают выходные данные, и имеют следующие свойства:

Алгоритм работы каждого компонента следующий:

Подобная реализация является довольно простой и надёжной. Сам кэш при этом “плоский”, т.е. анализ не хранит информацию когда были сохранены все данные. Результаты свежего анализа не отличаются от результатов давнего анализа.

Весь остальной анализ работает также. Анализатор “не знает”, что он запущен в специальном режиме. Отличия касаются только выделенных компонент.

Были выделены следующие компоненты анализа:

Быстрый старт

Предполагает, что проект регулярно меняется и анализируется. Первоначальный анализ выполняется командами:

svace init
svace build make
svace analyze # 1й анализ

Все последующие анализы командами:

# Внесение изменений.

make clean
svace build make
svace analyze # Повторный анализ.

Анализ с кэшем позволяет ускорить последнюю команду, для этого при анализе необходимо установить опцию PERSISTENT_MODE с помощью svace config.

Первоначальный анализ:

svace init
svace build make
svace config PERSISTENT_MODE true
svace analyze  # 1-й анализ.

Последующие анализы:

# Внесение изменений.

make clean
svace build make
svace analyze  # Повторный анализ.

ВАЖНО: анализ не является инкрементальным. После всех изменений требуется полная пересборка проекта, иначе будет анализироваться только часть проекта.

Детали реализации

Все данные, которые сохраняются для повторного анализа, помещаются в директорию .svace-dir/analyze-storage. Эта директория не очищается во время анализа. Поэтому её размер будет постепенно увеличиваться. В настоящий момент мы рекомендуем периодически полностью удалять эту директорию.

Если режим с кэшем включен, то анализ напечатает на консоль:

Persistent mode is enabled. Some results may be got from cache.

Известные ограничения

Анализ спроектирован так, чтобы результаты не отличались от обычного режима. Тем не менее возможны отличия, если поменялись данные, собираемые на предварительной фазе анализа:

Подобное поведение будет исправлено в следующих версиях.

В большинстве случаев режим бесполезен для анализа spotBugs и tags-javac. Эти анализы запускаются для единицы компиляции, которая обычно в java-проектах одна. Поэтому, если были какие-либо изменения, анализ будет выполняться заново.

Замеры времени работы

Первый анализ в среднем может работать чуть медленнее, чем анализ без кэша. Все последующие анализы должны выполняться значительно быстрее обычного анализа. Ниже приведены замеры для некоторых проектов:

OpenSSL (С)

Обычный анализ: 522 секунды

Первый анализ с кэшем: 597 секунд

Последующий анализ с кэшем: 99 секунд

Android 11 (Java)

Обычный анализ: 138 минут

Первый анализ с кэшем: 140 минут

Последующий анализ с кэшем: 44 минуты

Набор из 10 проектов на Go

Обычный анализ: 14 минут

Первый анализ с кэшем: 23 минуты

Последующий анализ с кэшем 3 минуты.

Повторный анализ проектов на языках C/C++/Go ускоряется в среднем в 5 раз. Анализ проектов на Java/Kotlin примерно в 3 раза.