[Из песочницы] Профилировка производительности и памяти с разных углов обзора

Выбор инструмента


image

Проблема профилировки рано или поздно встает перед любым проектом, претендующим на роль лучшего в своей области. Какой инструмент выбрать — всегда большой вопрос. Одни инструменты показывают одну часть картины, другие другую. И рано или поздно начинаешь писать свой тул (англ. tool — орудие\инструмент), который отвечает на насущные проблемы именно данного конкретного проекта. Однако время на написание своего «орудия» всегда приходится вычитать из времени отведенного на сам проект.
Поэтому серьезный профайлер написать не получается…

Но как получить все и сразу? (Тут мне почему то вспоминается песня Queen «I want it all»)
А что если был бы такой API, который позволяет воспользоваться силой уже существующих профайлеров и расширяет их область применения на наши нужды?

Так вот, такой API есть. И, более того, он бесплатный и с открытым исходным кодом. Называется Intel® Single Event API, сокращенно Intel® SEAPI.

Давайте посмотрим, что это такое и насколько сложно им пользоваться.

Что он нам дает?


Судя по wiki официального сайта, этот API работает на Windows, Linux, MAC OS X, Yocto и Android. И позволяет визуализировать свои трассы в Systrace, chrome://tracing, Windows Performance Analyzer, XCode Instruments, QT Creator profiler, Trace Compass. Так же он умеет конветировать трассы в два способа отображения диаграмм: DGML и GraphViz. Выберите из этого то, что Вам наиболее знакомо и вперед!

Как этим пользоваться?


Сначала его придется скачать и скомпилировать. Это не сложно, если у вас уже есть cmake, python и «build environment» (компиляционное окружение). На Windows это студия 2013, ниже нельзя, потому что там уже во всю используется С++11. На других платформах каждый сам знает все стандартные средства для сборки.

Сборка очень проста: в корневой директории запустите «python buildall.py -i» это не просто скомпилирует проект, но и соберет инсталлер.

После инсталляции в папке bin можно найти пример использования «TestIntelSEAPI», собранный из main.cpp — он показывает все возможности, доступные на текущий момент.

Дальше проще — добавляем к себе в проект itt_notify.hpp и расставляем макросы из него в своем коде.

Самый простой и полезный макрос — это ITT_FUNCTION_TASK () — просто оставим его в начале тех функций, которые нас больше всего волнуют. Все время жизни функции будет замеряно каждый раз как она вызывается.

Если вдруг замерять надо нечто меншее чем функция, есть макрос ITT_SCOPE_TASK (name).

К обоим макросам можно добавлять аргументы: ITT_ARG (name, value).

Также можно трассировать и «счетчики» ITT_COUNTER (name, value).

Для линковки понадобится включить в проект «ittnotify*.lib» из папки bin.

Однако, если наш проект написан на чистом «C» — эти макросы не подойдут. Но есть и хорошая новость — эти макросы ни что иное, как обертка над более низкоуровневым трассировочным API — itt_notify.

Примеры использования и того и другого можно найти в main.cpp

Есть хорошие новости и для любителей (а то и профессионалов) скриптовых языков: совсем недавно была добавлена поддержка Python и Java. Примеры даны прямо в самих обертках.

Запускаем, отбегаем и …

Вот, что мы получим, например, в Windows Performance Analyzer:
image
WPA хорош тем, что он уже многое умеет. Очень многое. Наша задача только добавить в него свои события и счетчики — тогда можно будет воспользоваться всей его мощью на благо своего проекта.

Ту же трассу посмотрим с помощью GraphViz (из трассы получился run-time call-graph):
image

Ну и конечно XCode Instruments:
image
Про него кстати есть отличный пост на хабре: habrahabr.ru/post/168491

— А что насчет памяти?
— Ах да, память!

Профилировка памяти заключается в добавлении memory.cpp к себе в проект. Все CRT аллокации будут представлены в виде счетчиков — на каждый размер аллокации отдельный счетчик. Это позволит видеть общую картину по времени, найти накопления памяти и ее утечки.

Вот, например, как это будет выглядеть в chrome://tracing:

image

chrome://tracing это уникальная вещь — профайлер, встроенный непосредственно в браузер. Он доступен везде, да и способностей по отображению данных ему не занимать. Эти особенности, на мой взгляд, и делают его основным фаворитом Intel® SEAPI.

image

Самое приятное в Intel® SEAPI это его легкая расширяемость. Хочешь добавить новый язык — 150 строк кода на новом языке. Хочешь добавить новый формат или вьювер — 100 строк кода на питоне. Хочешь использовать в тестовой инфраструктуре для ночного контроля перформанса — запускай тесты, добавив две переменных окружения и будут трассы. Лениво трассы каждый раз открывать — сконвертируй в свой формат основную статистику и встрой в тестовый репрот.

В общем, на мой взгляд вещь архи-полезная. Надо только потратить какое-то время и с ней разобраться.

Пожалуйста, пишите ваши отзывы, они помогут мне улучшить статью.

© Habrahabr.ru