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

в 17:41, , рубрики: android, c++, DGML, DTrace, ETW, ftrace, GraphViz, intel, linux, mac os x, open source, profiling, QtCreator, TraceCompass, tracing, windows, yocto, высокая производительность

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

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

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

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

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

Автор: alraud

Источник


* - обязательные к заполнению поля


https://ajax.googleapis.com/ajax/libs/jquery/3.4.1/jquery.min.js