Хабрахабр

[Из песочницы] Профилирование под Linux с помощью Performance Analyzer

Он входит в пакет Sun/Oracle Developer Studio [1]. Коллеги, считаю полезным рассказать об удобном и бесплатном профилировщике кода для Linux/Solaris. Он прост в использовании, наглядно и удобно устроен анализ результатов. По моему мнению, другие части этой среды разработки несколько бесполезны, но профилировщик, который называется Performance Analyzer, очень удачный. При наличии этого инструмента использование gprof видится странной прихотью и потерей времени. На мой взгляд, профилировщик все еще превосходит многие аналоги под Linux.

Просто запомните, что такой продукт существует. Если вы не планируете использовать Performance Analyzer немедленно, то дальше можно не читать. Если же интересно взглянуть, то добро пожаловать.

Профилировщик состоит из двух частей: collect – запускает приложение и собирает данные, записывает результаты эксперимента; analyzer – графический интерфейс, зачитывает данные эксперимента и предоставляет возможности для удобного анализа горячих точек и деревьев вызовов функций.

Коротко о важных преимуществах и недостатках:

Плюсы:

  • бесплатный;
  • не требует перекомпиляции кода и перелинковки исполняемого файла;
  • работает с компиляторами gnu и sun;
  • не меняет времени исполнения программы при сборе данных;
  • обладает интуитивно понятным графическим интерфейсом;
  • оснащен развитым интерфейсом командной строки для автоматического анализа;
  • позволяет быстро взглянуть на результат работы компилятора;
  • имеет статистический профилировщик, который достаточно точен даже для не особенно трудоемких кусков;
  • удобно сделан анализ и сравнительный анализ нескольких запусков программы;
  • не искажает результаты.

Некоторые минусы:

  • rрафический интерфейс написан на Java. Иногда падает при загрузке, простой перезапуск помогает;
  • измеряет только CPU время если есть возможность поправить ядро, то это ограничение можно снять;
  • в многопоточных приложениях время, занимаемое функцией, – сумма времен, проведенных в этой функции в каждом потоке;
  • статистический профилировщик шумит и затрудняет микроптимизацию циклов.

Платформы

Де-факто я успешно использовал его на Redhat, CentOS и Ubuntu. Формально Oracle Developer Studio поддерживает только Solaris и Oracle Linux. В документации утверждается, что с Java проектами инструмент тоже справляется. Collect/analyzer я использовал только для оптимизации С/C++/Fortran приложений.

В нем не должны быть удалены имена функций, иначе нечего будет анализировать. Анализ кода, конечно, начинается со сборки исполняемого файла. Конечно, в первую очередь имеет смысл профилировать с вашими любимыми опциями оптимизации. Отладочные символы нужны, если вы захотите разглядывать строчки кода из analyzer. Например, если Вам необходимо просто посмотреть граф вызовов, а не измерять производительность. Есть сценарии, когда полезно профилировать код без оптимизации, однако это бывает редко.

Итак, для запуска вам надо, как-обычно, собрать исполняемый файл, например:

g++ -O3 –g example.c –o ex

Второй шаг — запуск из-под collect:

$pathToSunStudio/collect ./ex

N.er, где N — номер запуска. В результате работы профилировщика в текущей директории создается под-директория эксперимента test. (Важно: если ваша программа была прервана, директория эксперимента окажется поломанной).

Самый приятный шаг — запуск GUI:

$pathToSunStudio/analyzer test.1.er

Наш пример вычисляет сумму натурального и десятичного логарифмов целых чисел от 2 до 20 000 000. В случае нашего незатейливого примера ознакомимся с кодом прямо из GUI analyzer. Желтым цветом выделяются "теплые" строки.

Изначально функции отсортированы по времени, проведенному собственно в самой функции (exclusive time). Перейдем к списку "тяжелых функций". Можно сортировать и по сумме времени в функции и в ее детях (inclusive time).

В нашем простом примере видно, что в t1() мы пришли из main(), а половина времени выполнения всей программы занимает функция sumlog(). Как положено, можно походить по стеку вызовов.

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

er_print -functions test.1.er test.2.er

напечает время работы функций из двух запусков.

таблица с временами

<p>Functions sorted by metric: Exclusive Total CPU Time
Excl. Incl. Name
Total Total
CPU sec. CPU sec.
4.160 4.160 Total
3.140 3.140 __ieee754_log
0.330 1.990 __ieee754_log10
0.270 1.880 sumlog(int)
0.180 2.280 sumlog10(int)
0.100 1.610 log
0.090 2.100 log10
0.050 0.050 isnan</p>
<ol>
<li>4.160 __libc_start_main</li>
<li>4.160 main</li>
<li>1.880 t1(int)</li>
<li>2.280 t2(int)

Я очень часто начинаю работу с новым проектом с запуска Performance Analyzer, поскольку сразу можно понять какой код действительно запускается и в каких сценариях. Lifehack. Внимательно разглядывая граф вызовов программы, можно много полезного узнать работу и архитектуру новой для вас кодовой базы.

В заметке я показал самый простой сценарий использования и, конечно, Performance Analyzer умеет гораздо больше. Sun/Oracle Studion Performance Analyzer достаточно мощный и удобный инструмент. Основной вывод: такой инструмент существует и может нанести много пользы вашим проектам. Если интересно узнать поподробнее, то обращайтесь к документации [2].

  1. Oracle Developer Studio
  2. Oracle Developer Studio 12.6: Performance Analyzer
  3. Performance Analyzer
Показать больше

Похожие публикации

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *

Кнопка «Наверх»