В современном мире разработка программного обеспечения (ПО) превратилась в одну из самых дорогостоящих индустрии?. Любые ошибки и недочеты в процессе его создания могут привести к нежелательным результатам, поэтому разработка «совершенного» кода очень важна.
В большинстве случаев даже правильно работающий код может быть усовершенствован. Причина заключается в том, что выбранный алгоритм является базовым, и при его реализации на конкретном языке программирования не в полной мере учитываются условия поставленной задачи, специфика языка программирования и схемы трансляции. Недостаточно знать базовые алгоритмы и их теоретическую сложность, уметь программировать на высокоуровневых языках программирования, нужно уметь оценивать реальное время выполнения программ [1], владеть инструментальными средствами, позволяющими проводить тестирование программного обеспечения [2, 3], определять проблемы производительности на уровне исходного кода, а также знать методики оптимизации кода и уметь применять их на практике [4].
Данная статья посвящена использованию средства профилирования Visual Studio (VS) [5] для оптимизации программного обеспечения, написанного на языке С# [6].
В работе [7] нами была представлена методика применения средств профилирования VS на примере оптимизации кода приложения, решающего задачу о «красивом тексте» [8] с использованием регулярных выражений и Linq-запросов языка C#. Данная методика позволила выявить «проблемные» места в приложении с точки зрения использования центрального процессора (ЦП). Применив к проблемным местам «методику минимизация объема работы, выполняемой внутри цикла» [4], нам удалось сократить время работы приложения в 4 раза.
Продемонстрируем использование данной методики на более сложной задаче. Дано приложение ColorFractus, реализующее фрактальное сжатие/восстановление изображений [9, 10]. Используя средства профилирования VS, необходимо: выявить проблемные места в приложении; предположить причины проблем; предложить и реализовать способы решения проблем; показать, что внесенные изменения в приложение ColorFractus, действительно привели к оптимизации.
Использование средств профилирования VS начинается с настройки сеанса анализа производительности. Для этой цели нужно открыть код программы (решение) в среде VS. Выбрать конфигурацию «Выпуск»/«Release» (запуск от имени администратора). Установить флажок «Выборка циклов ЦП» или «Инструментирование», и нажать кнопку «Готово».
Для запуска процесса сбора данных о производительности в меню «Анализ» необходимо выбрать «Профилировщик производительности», установить флажок «Мастер производительности» и нажать кнопку «Запуск». Исследуемое решение запускается, и VS начинает собирать данные о его производительности в реальном времени, которые записываются специальный файл (*.vsp). После завершения сбора данных файл с отчетом отображается в окне «Отчет о производительности». Для приложения ColorFractus мы получили следующий отчет о производительности (рис. 1).
Рис. 1. Статистические данные, полученные методом выборки
Рис. 2. Статистические данные о производительности оптимизированного кода
Проанализировав данные, представленные на рис. 1, можно сделать следующие выводы:
1. Выполнение программы нагружает ЦП не более чем на 25 %. Компьютер, на котором проводились замеры, имеет 4-поточный процессор. Это означает, что программа выполняется только в одном потоке процессора.
2. Метод сжатия (Compress.Start) выполняется почти 87 % от всего времени работы приложения. Это подтверждает то, что фрактальное сжатие является несимметричным алгоритмом сжатия, так как время сжатия изображения больше времени восстановления.
3. В методе Compress.Start вызывается метод Compress.CompressStart, который, перебирая все ранговые блоки, находит подходящий доменный блок для каждого рангового и занимает 80 % времени от всего выполнения программы. Это означает, что данный метод является самым дорогостоящим с точки зрения скорости выполнения.
4. Внутри метода Compress.CompressStart вызывается метод Compress.Distance, который предназначен для сравнения блоков с помощью подсчета дистанции (числовая характеристика, оценивающаяся функцией среднеквадратического отклонения) между блоками. Суммарное время выполнения всех вывозов данной функции занимает около 48 %.
Решением указанных проблем мы видим: в предварительной классификации ранговых и доменных блоков по признаку распределения яркости отдельных пикселей блока; в распараллеливании циклов перебора ранговых блоков, во время поиска наиболее подобного доменного блока и во время восстановления изображения, так как эти процессы являются независимыми; в сокращении количества вызовов метода поиска дистанции между блоками; в добавлении кеширования, принципом которого будет сохранение доменного блока для конкретного ключа, и присваивании последующему ранговому блоку, который имеет такой ключ. Все предложения по изменению кода приложения ColorFractus были нами реализованы в полном объеме.
Рис. 3. Фрагменты сравнения двух отчетов производительности
Рис. 4. Фрагмент сравнения отчетов производительности (отрицательный результат)
Чтобы убедиться в том, что внесенные изменения в исходный код привели к его оптимизации, повторно запустим профилировщик производительности, а также сравним полученные отчеты (до внесения изменений в код приложения и после). Полученные данные представлены на рис. 2 и 3.
Проанализировав данные, представленные на рис. 2 и 3, можно сделать следующие выводы:
1. Большую часть времени выполнения приложения ColorFractus ЦП загружен на 100 %. Это означает, что некоторые участки кода выполняются параллельно и задействованы все 4 ядра (потока) ЦП.
2. Время выполнения метода Compress.Start составляет 5,5 секунд в отличие от 48 секунд в исходной программе.
3. Время выполнения метода Decompress.Start составляет чуть более одной секунды в отличие от 6,4 секунды в исходной программе.
4. Полное время выполнения и сжатия/восстановления изображения уменьшилось с 55 секунд до 6,8, что дает увеличение в скорости сжатия приблизительно в 8 без потери качества обрабатываемого изображения.
Таким образом, мы убедились, что внесенные изменения в приложение ColorFractus действительно привели к его оптимизации.
Следует отметить, что не всегда удается оптимизировать приложения. Так, например, на этапе сравнения отчетов о производительности в ходе оптимизации приложения, позволяющего находить все вещественные числа в больших объемах текстовой информации с помощью регулярных выражений, были получены данные, представленные на рис. 4.
Проанализировав полученные данные, можно сделать вывод, что наши действия, направленные на оптимизацию кода ухудшили производительность приложения, поэтому от таких «оптимизаций» следует отказаться.
В заключение следует отметить, что средства профилирования VS – это удобный и доступный для разработчиков программного обеспечения помощник в решении проблемы разработки совершенного кода. Обучение студентов IT-направлений навыкам использования средства профилирования VS, для оптимизации программного кода, поможет выпускникам вузов в их будущей профессиональной деятельности.
Библиографическая ссылка
Батталов А.И., Батталова Н.И. ИСПОЛЬЗОВАНИЕ СРЕДСТВ ПРОФИЛИРОВАНИЯ VISUAL STUDIO ДЛЯ ОПТИМИЗАЦИИ ПРОГРАММНОГО ОБЕСПЕЧЕНИЯ // Научное обозрение. Технические науки. – 2018. – № 1. – С. 5-9;URL: https://science-engineering.ru/ru/article/view?id=1172 (дата обращения: 23.11.2024).