PVS-Studio — статический анализатор, выявляющий ошибки в исходном коде приложений на языке C/C++. Подобно компилятору, анализатор обходит файл за файлом в каталоге с исходниками проекта, выполняя свою задачу. Но и без использования внешних инструментов, сборка некоторых проектов может длиться несколько часов. Статический анализ такого проекта будет занимать ещё больше времени. Для сборки крупных проектов, некоторые разработчики прибегают к использованию распределённой сборки с помощью инструмента IncrediBuild. В данной статье не будут рассмотрены детали интеграции PVS-Studio в IncrediBuild, а будет рассказано о проверке большого проекта, замерах времени и других интересных фактах.
Об инструментах PVS-Studio и IncrediBuild
PVS-Studio выполняет анализ C/C++ кода и подсказывает программисту, где находятся возможные ошибки, или указывает на участки кода, которые могут повлечь проблемы в будущем.
Анализатор состоит из нескольких частей, и проверку каждого файла с исходным кодом выполняет процесс PVS-Studio.exe (ядро анализатора). Далее я буду использовать термин «поток», подразумевая, что в одном потоке запущен один процесс PVS-Studio.exe для проверки одного исходно файла проекта. А файлов будет очень много…
IncrediBuild — программное обеспечение для распределённых вычислений, которое позволяет с лёгкостью задействовать несколько компьютеров и ускорить работу своих приложений. При этом не нужно беспокоится за зависимости, которые присутствуют у распараллеленных процессах.
Мы будем использовать IncrediBuild, чтобы выполнить анализ проекта во много потоков, используя дополнительные компьютеры.
О проверяемом проекте
Проверяемый проект пожелал быть неназванным, но он имеет около 7 млн. строк исходного кода. Размер кодовой базы — 300 MB, и около 9000 файлов. Проверка такого проекта анализатором PVS-Studio на компьютере с процессором Intel Core i7-4770 3.40 GHz и 16 GB ОЗУ в 8 потоков занимает около 6 часов. Далее я расскажу, как с помощью инструмента IncrediBuild и нескольких компьютеров удалось сильно ускорить время анализа проекта.
Результаты
Во всех тестах использовались компьютеры примерно одной конфигурации, позволяя выполнять анализ в 8 потоков на каждом из них.
При настройке IncrediBuild на компьютерах, один из них настраивается как координатор, остальные настраиваются как агенты, которые подключаются к координатору. Т.к. проверка проекта запускалась на агенте, то на этом компьютере в настройках было задано загружать только 1 поток, чтобы излишняя нагрузка не мешала сбору результатов. Для координатора тоже было задано выполнять вычисления только в 1 поток.
Тест первый
Для первого тестового запуска PVS-Studio, были доступны 5 компьютеров:
- Координатор (1 поток);
- Агент N1 (1 поток, на нём запускался анализ);
- Агент N2 (8 потоков);
- Агент N3 (8 потоков);
- Агент N4 (8 потоков).
На рисунке 1 представлена проверка проекта анализатором в 26 потоков.
Рисунок 1 — Проверка проекта анализатором в 26 потоков
Для читателей, не знакомых с IncrediBuild, поясню, что зелёной полоской обозначается 1 процесс, который успешно отработал на компьютере с именем, которое написано слева. На полоске пишется имя процесса. А по временной шкале снизу можно определить, в какой момент времени процесс стартовал и завершился, таким образом сразу видна длительность работы любого распределённого процесса.
На рисунке выше запечатлена проверка довольно крупных исходных файлов. Распараллеливание выполняется очень равномерно и эффективно при длительной загрузке потоков.
На рисунке 2 представлен анализ разных по объёму файлов исходного кода.
Рисунок 2 — Проверка мелких и крупных файлов проекта в 26 потоков
Как мы видим, быстрое завершение потоков приводит к накладным расходам на создание новых потоков и происходит небольшое простаивание некоторых компьютеров. Но в целом распараллеливание выполняется очень хорошо. Анализ проекта выполнился за 2 часа 10 минут вместо 6 часов, очень даже неплохо.
Тест второй
Для второго тестового запуска PVS-Studio, были доступны 7 компьютеров:
- Координатор (1 поток);
- Агент N1 (2 потока, на нём запускался анализ);
- Агент N2 (8 потоков);
- Агент N3 (8 потоков);
- Агент N4 (8 потоков);
- Агент N5 (8 потоков);
- Агент N6 (8 потоков).
На рисунке 3 представлена проверка проекта анализатором в 43 потока.
Рисунок 3 — Проверка проекта анализатором в 43 потока.
Список из 43 потоков не удаётся увидеть целиком, но хорошо видно, как возросло простаивание компьютеров при проверке маленьких файлов. Но всё равно выглядит очень здорово, учитывая, что общее время анализа составило уже 1 час 24 минуты вместо 6 часов и из приложенных усилий было только быстрая установка IncrediBuild на нужные компьютеры. Для настройки PVS-Studio потребовалось изменить всего 1 пункт в настройках — задать количество потоков.
Заключение
Воспользовавшись инструментом IncrediBuild, который обычно присутствует для сборки очень крупных проектов, мы смогли ускорить время анализа проекта с помощью PVS-Studio в 4.2 раза, задействовав несколько компьютеров разработчиков, которые сидели рядом. Все настройки IncrediBuild использовались по умолчанию, а их там довольно много. Наверняка можно достичь ещё большей производительности, но нам был интересен «быстрый старт».
Ещё раз, что нам потребовалось для быстрой проверки проекта с помощью PVS-Studio:
- Установить IncrediBuild на нужные компьютеры.
- Увеличить количество потоков в настройках PVS-Studio.
- Запустить анализ из консоли IncrediBuild.
- Проверка на 1 компьютере — 6 часов.
- Проверка в 26 потоков — 2 часа 10 минут.
- Проверка в 43 потока — 1 час 24 минуты.
О том, как использовать PVS-Studio и IncrediBuild в своём проекте, вы можете прочесть в статье: "Интеграция PVS-Studio с системой распределённой сборки IncrediBuild".
Если хотите поделиться этой статьей с англоязычной аудиторией, то прошу использовать ссылку на перевод: Svyatoslav Razmyslov. Using IncrediBuild to Assist Analysis of a Large Project by PVS-Studio.
Прочитали статью и есть вопрос?
Часто к нашим статьям задают одни и те же вопросы. Ответы на них мы собрали здесь: Ответы на вопросы читателей статей про PVS-Studio, версия 2015. Пожалуйста, ознакомьтесь со списком.