ݺߣ

ݺߣShare a Scribd company logo
Профайлинг в C++
Обзор ПО для профилирования
О себе
● С++ разработчик в SolarWinds
● Участвую в деятельности Российской РГ21
● Разработчик Boost.Algorithm и gImageReader
● zamazan4ik везде - Telegram, Twitter, GitHub, Reddit, etc.
● https://github.com/ZaMaZaN4iK
Постановка проблемы
● Есть приложение
● Оно тормозит
● Мы хотим (нас заставляют) это исправить
● А мы понятия не имеем, с какой стороны подступиться
● Искать руками долго/лень/сроки поджимают/что-то ещё (нужное
подчеркнуть)
Профилирование, профилировщики и т.д.
● Профилирование служит для получения информации о работе
программы в целом: какие функции сколько времени выполняются,
нахождение «горячих» мест и других особенностей работы программы
● Профилировщик - инструмент, который занимается профилировкой
Классификация ПО
● Эмуляторысимуляторы
● Сэмплеры
● Ручные (да-да, так тоже можно :)
● Event-based
Сэмплеры
● Регулярно «срезают» ресурсы программы
● Почти не влияют на скорость выполнения (зависит от частоты)
● Некоторые функции пропадают :-)
● Погрешности
Эмуляторы
● Эмуляция профилируемого устройства
● Значительное замедление программы
● Функции не пропадают :-)
● Сложность реализации
● Соответствие реальному аппаратному обеспечению (нет)
Проблемы
● Разные производители процессоров (Intel, AMD, etc.)
● Разные архитектуры
● Разные ОС (GNU/Linux-based, Windows, macOS, Android, iOS, etc.)
gprof
● GNU/Linux
● Консольный интерфейс
● Требует перекомпиляции проекта
● Профилирует только user-space код
● Не может профилировать многопоточные приложения
● https://sourceware.org/binutils/docs/gprof/
gprof: как использовать
1. Пишем программу
2. Компилируем с флагом “pg”
3. Запускаем программу
4. Запускаем gprof с получившимся файлом
5. Анализируем результат
gcov
● Консольный интерфейс
● Считает покрытие тестами кода
● Но оказывается тоже может профилировать!
● Занимается line-by-line профилированием
gcov: как использовать для профилирования
1. Пишем программу
2. Компилируем её с флагами “-fprofile-arcs -ftest-coverage”
3. Запускаем программу (появятся файлы для gcov)
4. Запускаем gcov с файлом исходного кода
5. Анализируем результат
gprof2dot
● Написан на Python 3
● Понадобится Graphviz - https://www.graphviz.org/
● Конвертер в dot graph
● Поддерживает: perf, callgrind, oprofile, sysprof, Vtune, prof, gprof, xperf, Very
Sleepy
● https://github.com/jrfonseca/gprof2dot
gprof2dot: пример результата
gprof2dot: примеры использования
● gprof path/to/your/executable | gprof2dot.py | dot -Tpng -o output.png
● perf record -g -- /path/to/your/executable
perf script | c++filt | gprof2dot.py -f perf | dot -Tpng -o output.png
● amplxe-cl -report gprof-cc -result-dir output -format text -report-output
output.txt
gprof2dot.py -f axe output.txt | dot -Tpng -o output.png
gperftools (Google Performance Tools)
● GNULinux, …
● Умеет в многопоточные приложения
● Ручная разметка интересующих вас мест для профилирования
● Крайне низкие накладные расходы
● https://github.com/gperftools/gperftools
gperftools: как использовать
1. Написать программу, подключить <gperftools/profiler.h>
2. Пометить интересующие вас места ProfilerStart(“file.log”)/ProfilerStop()
3. Скомпилировать с отладочными символами
4. Слинковать с profiler.so
5. Запустить
6. Полученный file.log конвертировать в тот же callgrind:
a. pprof --callgrind ./test file.log > profile.callgrind
Valgrind
● Эмулятор
● GNU/Linux, macOS
● Open-Source
● Утилиты: Cachegrind, Callgrind, DRD, Helgrind, Massif, Memcheck
● Расширяемость
● http://valgrind.org/
Valgrind: особенности
● Очень сильно замедляет работу программы
○ 10-50x
○ Зависит от утилиты и настроек
● Старается эмулировать процессор
○ Branch-prediction на уровне процессоров 2004 года
○ Попытки смоделировать ваш кеш (гадает по CPUID)
○ Если не смог подобрать под Ваш процессор, то… всё грустно
○ Можете ему помочь и сами написать свою реализацию кеша :)
kcachegrind/qcachegrind
● Платформы
○ kcachegrind: GNU/Linux
○ qcachegrind: GNU/Linux, Windows, macOS
● Программа для просмотра “выхлопа” профилировщика
● https://github.com/KDE/kcachegrind
Инструменты профайлинга С++ кода
Heaptrack
● https://github.com/KDE/heaptrack
● Linux-only
● GUI + консольный интерфейс
● Профилирует и визуализирует:
○ Динамику потребления памяти во времени
○ Пиковые потребления
○ Количество “утёкшей” памяти
○ Распределение потребления памяти по функциям
○ Flame Graph потребления памяти
Инструменты профайлинга С++ кода
FlameGraph
● Визуализация стека чего-нибудь
● Не ограничена только CPU (Memory, IO)
● Интерактивно
● Кастомизируемо
● Хорошая поддержка профилировщиков
● https://github.com/brendangregg/FlameGraph (аккуратно - Perl)
FlameGraph
Intel VTune Amplifier
● От Intel
● Проприетарный
● GNU/Linux, Windows, macOS (только как хост)
● Уже бесплатный для коммерческого использования
● GUI (Eclipse) + командная строка
● Только на CPU от Intel
VTune: что умеет
● Hotspot analysis
● Concurrency profiling
● Cache profiling
● Branch-prediction profiling
● GPU profiling
● Disk IO profiling
Инструменты профайлинга С++ кода
CodeXL
● От AMD
● Работает с CPU от AMD
● https://github.com/GPUOpen-Tools/CodeXL
● GNU/Linux, Windows
● Бывают баги
Инструменты профайлинга С++ кода
CodeXL: функционал
● Cache line utilization
● Instruction-based sampling
● Branch profiling
● Data access profiling
● Time-based sampling
● Instruction access
● Call graph
● Power profiling
● GPU profiling
Xcode + Instruments
● Идёт в комплекте с Xcode
● В ряде случаев использует “под капотом” DTrace
● Умеет профилировать приложения на macOS, iOS
● Time profiler, memory profiler
● Wi-Fi, GPS, Energy, etc. (iOS)
Instruments
SimplePerf (+ Android Studio 3.1)
● Профайлер для Android
● Консольный интерфейс
● https://android.googlesource.com/platform/system/extras/+/master/simpleperf
● Начиная с Android 3.1 может профилировать C++ код прямо из IDE
○ Требует Android 8 (API Level 26) и выше
Остались за рамками доклада (извините)
● OProfile - http://oprofile.sourceforge.net
● TAU - https://www.cs.uoregon.edu/research/tau/home.php
● LTTng - https://lttng.org/
● xperf - https://docs.microsoft.com/en-us/windows-hardware/test/wpt/
● GlowCode - https://www.glowcode.com/
● DS-5 (built-in profiler) - https://developer.arm.com/
● Visual Studio (built-in profiler)
● Oracle Developer Studio (built-in profiler)
● Intel IACA
● DTrace - <link>
Советы
● Не оптимизируйте без профилирования
● Выбирайте профайлер внимательно
● Изучите профайлер перед использованием
Полезные ссылки
● https://eax.me/c-cpp-profiling
● https://github.com/fenbf/AwesomePerfCpp
● https://software.intel.com/en-us/vtune-amplifier-help
● http://www.brendangregg.com
Спасибо за внимание
Вопросы?

More Related Content

What's hot (13)

Илья Ковалевский "Что такое Qt и что с ним можно сделать"
Илья Ковалевский "Что такое Qt и что с ним можно сделать"Илья Ковалевский "Что такое Qt и что с ним можно сделать"
Илья Ковалевский "Что такое Qt и что с ним можно сделать"
Dmitry Savchenko
системы автоматизированного перевода
системы автоматизированного переводасистемы автоматизированного перевода
системы автоматизированного перевода
MariaSuina
Антон Довгоброд: Highload и очереди задач на примере PHP + Gearman + Yii2
Антон Довгоброд: Highload и очереди задач на примере PHP + Gearman + Yii2Антон Довгоброд: Highload и очереди задач на примере PHP + Gearman + Yii2
Антон Довгоброд: Highload и очереди задач на примере PHP + Gearman + Yii2
Oleg Poludnenko
Test traffic 100G generator and analyzer
Test traffic 100G generator and analyzerTest traffic 100G generator and analyzer
Test traffic 100G generator and analyzer
ishevchuk
Sampling profiling
Sampling profilingSampling profiling
Sampling profiling
Slach
Как писать на PHP и не стать быдло-кодером
Как писать на PHP и не стать быдло-кодеромКак писать на PHP и не стать быдло-кодером
Как писать на PHP и не стать быдло-кодером
Kirill Kovalchuk
Как мы делаем раскладку Календаря@Mail.Ru
Как мы делаем раскладку Календаря@Mail.RuКак мы делаем раскладку Календаря@Mail.Ru
Как мы делаем раскладку Календаря@Mail.Ru
Vladimir Rudnyh
Дизайн платформа в Avito - Александр Лобашев (Avito)
Дизайн платформа в Avito - Александр Лобашев (Avito)Дизайн платформа в Avito - Александр Лобашев (Avito)
Дизайн платформа в Avito - Александр Лобашев (Avito)
AvitoTech
Markelov-AUG-Jira
Markelov-AUG-JiraMarkelov-AUG-Jira
Markelov-AUG-Jira
Gonchik Tsymzhitov
Незаменимый С++. Антон Полухин. CoreHard Spring 2019
Незаменимый С++. Антон Полухин. CoreHard Spring 2019Незаменимый С++. Антон Полухин. CoreHard Spring 2019
Незаменимый С++. Антон Полухин. CoreHard Spring 2019
corehard_by
Rempl — крутая платформа для крутых инструментов - Роман Дворнов (Avito)
Rempl — крутая платформа для крутых инструментов - Роман Дворнов (Avito)Rempl — крутая платформа для крутых инструментов - Роман Дворнов (Avito)
Rempl — крутая платформа для крутых инструментов - Роман Дворнов (Avito)
AvitoTech
Повышаем и следим за качеством PHP кода
Повышаем и следим за качеством PHP кодаПовышаем и следим за качеством PHP кода
Повышаем и следим за качеством PHP кода
Aleksandr Makhomet
2016-08-20 01 Дмитрий Рабецкий, Сергей Сорокин. Опыт работы с Android Medi...
2016-08-20 01 Дмитрий Рабецкий, Сергей Сорокин. Опыт работы с Android Medi...2016-08-20 01 Дмитрий Рабецкий, Сергей Сорокин. Опыт работы с Android Medi...
2016-08-20 01 Дмитрий Рабецкий, Сергей Сорокин. Опыт работы с Android Medi...
Омские ИТ-субботники
Илья Ковалевский "Что такое Qt и что с ним можно сделать"
Илья Ковалевский "Что такое Qt и что с ним можно сделать"Илья Ковалевский "Что такое Qt и что с ним можно сделать"
Илья Ковалевский "Что такое Qt и что с ним можно сделать"
Dmitry Savchenko
системы автоматизированного перевода
системы автоматизированного переводасистемы автоматизированного перевода
системы автоматизированного перевода
MariaSuina
Антон Довгоброд: Highload и очереди задач на примере PHP + Gearman + Yii2
Антон Довгоброд: Highload и очереди задач на примере PHP + Gearman + Yii2Антон Довгоброд: Highload и очереди задач на примере PHP + Gearman + Yii2
Антон Довгоброд: Highload и очереди задач на примере PHP + Gearman + Yii2
Oleg Poludnenko
Test traffic 100G generator and analyzer
Test traffic 100G generator and analyzerTest traffic 100G generator and analyzer
Test traffic 100G generator and analyzer
ishevchuk
Sampling profiling
Sampling profilingSampling profiling
Sampling profiling
Slach
Как писать на PHP и не стать быдло-кодером
Как писать на PHP и не стать быдло-кодеромКак писать на PHP и не стать быдло-кодером
Как писать на PHP и не стать быдло-кодером
Kirill Kovalchuk
Как мы делаем раскладку Календаря@Mail.Ru
Как мы делаем раскладку Календаря@Mail.RuКак мы делаем раскладку Календаря@Mail.Ru
Как мы делаем раскладку Календаря@Mail.Ru
Vladimir Rudnyh
Дизайн платформа в Avito - Александр Лобашев (Avito)
Дизайн платформа в Avito - Александр Лобашев (Avito)Дизайн платформа в Avito - Александр Лобашев (Avito)
Дизайн платформа в Avito - Александр Лобашев (Avito)
AvitoTech
Незаменимый С++. Антон Полухин. CoreHard Spring 2019
Незаменимый С++. Антон Полухин. CoreHard Spring 2019Незаменимый С++. Антон Полухин. CoreHard Spring 2019
Незаменимый С++. Антон Полухин. CoreHard Spring 2019
corehard_by
Rempl — крутая платформа для крутых инструментов - Роман Дворнов (Avito)
Rempl — крутая платформа для крутых инструментов - Роман Дворнов (Avito)Rempl — крутая платформа для крутых инструментов - Роман Дворнов (Avito)
Rempl — крутая платформа для крутых инструментов - Роман Дворнов (Avito)
AvitoTech
Повышаем и следим за качеством PHP кода
Повышаем и следим за качеством PHP кодаПовышаем и следим за качеством PHP кода
Повышаем и следим за качеством PHP кода
Aleksandr Makhomet
2016-08-20 01 Дмитрий Рабецкий, Сергей Сорокин. Опыт работы с Android Medi...
2016-08-20 01 Дмитрий Рабецкий, Сергей Сорокин. Опыт работы с Android Medi...2016-08-20 01 Дмитрий Рабецкий, Сергей Сорокин. Опыт работы с Android Medi...
2016-08-20 01 Дмитрий Рабецкий, Сергей Сорокин. Опыт работы с Android Medi...
Омские ИТ-субботники

Similar to Инструменты профайлинга С++ кода (20)

Как перезапустить проблемное приложение и одновременно отладить его
Как перезапустить проблемное приложение и одновременно отладить егоКак перезапустить проблемное приложение и одновременно отладить его
Как перезапустить проблемное приложение и одновременно отладить его
Olga Rusakova
Разработка декстопных приложений для linux (Владимир Яковлев)
Разработка декстопных приложений для linux (Владимир Яковлев)Разработка декстопных приложений для linux (Владимир Яковлев)
Разработка декстопных приложений для linux (Владимир Яковлев)
-Доминанта
SWIG — cоздание мультиязыковых интерфейсов для C/C++ библиотек
SWIG — cоздание мультиязыковых интерфейсов для C/C++ библиотекSWIG — cоздание мультиязыковых интерфейсов для C/C++ библиотек
SWIG — cоздание мультиязыковых интерфейсов для C/C++ библиотек
Python Meetup
Flame graph: новый взгляд на старое профилирование
Flame graph: новый взгляд на старое профилированиеFlame graph: новый взгляд на старое профилирование
Flame graph: новый взгляд на старое профилирование
Кирилл Борисов
Rust - GDG DevFest 2016 Nizhny Novgorod
Rust - GDG DevFest 2016 Nizhny NovgorodRust - GDG DevFest 2016 Nizhny Novgorod
Rust - GDG DevFest 2016 Nizhny Novgorod
Nikita Baksalyar
Презентация про DTrace на ADDconf в Минске
Презентация про DTrace на ADDconf в МинскеПрезентация про DTrace на ADDconf в Минске
Презентация про DTrace на ADDconf в Минске
Alex Chistyakov
Применение DTrace для оптимизации производительности на примере двух больших ...
Применение DTrace для оптимизации производительности на примере двух больших ...Применение DTrace для оптимизации производительности на примере двух больших ...
Применение DTrace для оптимизации производительности на примере двух больших ...
SQALab
Use Grunt Luke
Use Grunt LukeUse Grunt Luke
Use Grunt Luke
Gleb Pospelov
Создаем Drupal дистрибутив: от идеи до сопровождения.
Создаем Drupal дистрибутив: от идеи до сопровождения.Создаем Drupal дистрибутив: от идеи до сопровождения.
Создаем Drupal дистрибутив: от идеи до сопровождения.
DrupalForumZP2012
Rust - GDG DevFest Siberia 2016
Rust - GDG DevFest Siberia 2016Rust - GDG DevFest Siberia 2016
Rust - GDG DevFest Siberia 2016
Nikita Baksalyar
Руслан Исай. Drupal - это для программистов
Руслан Исай. Drupal  - это для программистовРуслан Исай. Drupal  - это для программистов
Руслан Исай. Drupal - это для программистов
DrupalSib
Профилирование кода на C/C++ в *nix-системах / Александр Алексеев (Postgres P...
Профилирование кода на C/C++ в *nix-системах / Александр Алексеев (Postgres P...Профилирование кода на C/C++ в *nix-системах / Александр Алексеев (Postgres P...
Профилирование кода на C/C++ в *nix-системах / Александр Алексеев (Postgres P...
Ontico
Code Sharing - Как мы пришли к Unity Package Manager / Станислав Коротаев (Ba...
Code Sharing - Как мы пришли к Unity Package Manager / Станислав Коротаев (Ba...Code Sharing - Как мы пришли к Unity Package Manager / Станислав Коротаев (Ba...
Code Sharing - Как мы пришли к Unity Package Manager / Станислав Коротаев (Ba...
DevGAMM Conference
2016-09-17 02 Игорь Гончаровский. Техническая и программная сторона VoIP
2016-09-17 02 Игорь Гончаровский. Техническая и программная сторона VoIP2016-09-17 02 Игорь Гончаровский. Техническая и программная сторона VoIP
2016-09-17 02 Игорь Гончаровский. Техническая и программная сторона VoIP
Омские ИТ-субботники
Windbg: когда у нас не воспроизводится. Александр Головач ➠ CoreHard Autumn ...
Windbg: когда у нас не воспроизводится. Александр Головач ➠  CoreHard Autumn ...Windbg: когда у нас не воспроизводится. Александр Головач ➠  CoreHard Autumn ...
Windbg: когда у нас не воспроизводится. Александр Головач ➠ CoreHard Autumn ...
corehard_by
Lime.JS
Lime.JSLime.JS
Lime.JS
Pavlo Iuriichuk
Михаил Коробов: Как перейти на Python 3
Михаил Коробов: Как перейти на Python 3Михаил Коробов: Как перейти на Python 3
Михаил Коробов: Как перейти на Python 3
it-people
Применение фреймворка GStreamer в системе видеонаблюдения
Применение фреймворка GStreamer в системе видеонаблюденияПрименение фреймворка GStreamer в системе видеонаблюдения
Применение фреймворка GStreamer в системе видеонаблюдения
corehard_by
Сравнение технологий aiopg & asyncpg, Алексей Фирсов. 22 июня, 2019
Сравнение технологий aiopg & asyncpg, Алексей Фирсов. 22 июня, 2019Сравнение технологий aiopg & asyncpg, Алексей Фирсов. 22 июня, 2019
Сравнение технологий aiopg & asyncpg, Алексей Фирсов. 22 июня, 2019
Mail.ru Group
Как перезапустить проблемное приложение и одновременно отладить его
Как перезапустить проблемное приложение и одновременно отладить егоКак перезапустить проблемное приложение и одновременно отладить его
Как перезапустить проблемное приложение и одновременно отладить его
Olga Rusakova
Разработка декстопных приложений для linux (Владимир Яковлев)
Разработка декстопных приложений для linux (Владимир Яковлев)Разработка декстопных приложений для linux (Владимир Яковлев)
Разработка декстопных приложений для linux (Владимир Яковлев)
-Доминанта
SWIG — cоздание мультиязыковых интерфейсов для C/C++ библиотек
SWIG — cоздание мультиязыковых интерфейсов для C/C++ библиотекSWIG — cоздание мультиязыковых интерфейсов для C/C++ библиотек
SWIG — cоздание мультиязыковых интерфейсов для C/C++ библиотек
Python Meetup
Flame graph: новый взгляд на старое профилирование
Flame graph: новый взгляд на старое профилированиеFlame graph: новый взгляд на старое профилирование
Flame graph: новый взгляд на старое профилирование
Кирилл Борисов
Rust - GDG DevFest 2016 Nizhny Novgorod
Rust - GDG DevFest 2016 Nizhny NovgorodRust - GDG DevFest 2016 Nizhny Novgorod
Rust - GDG DevFest 2016 Nizhny Novgorod
Nikita Baksalyar
Презентация про DTrace на ADDconf в Минске
Презентация про DTrace на ADDconf в МинскеПрезентация про DTrace на ADDconf в Минске
Презентация про DTrace на ADDconf в Минске
Alex Chistyakov
Применение DTrace для оптимизации производительности на примере двух больших ...
Применение DTrace для оптимизации производительности на примере двух больших ...Применение DTrace для оптимизации производительности на примере двух больших ...
Применение DTrace для оптимизации производительности на примере двух больших ...
SQALab
Создаем Drupal дистрибутив: от идеи до сопровождения.
Создаем Drupal дистрибутив: от идеи до сопровождения.Создаем Drupal дистрибутив: от идеи до сопровождения.
Создаем Drupal дистрибутив: от идеи до сопровождения.
DrupalForumZP2012
Руслан Исай. Drupal - это для программистов
Руслан Исай. Drupal  - это для программистовРуслан Исай. Drupal  - это для программистов
Руслан Исай. Drupal - это для программистов
DrupalSib
Профилирование кода на C/C++ в *nix-системах / Александр Алексеев (Postgres P...
Профилирование кода на C/C++ в *nix-системах / Александр Алексеев (Postgres P...Профилирование кода на C/C++ в *nix-системах / Александр Алексеев (Postgres P...
Профилирование кода на C/C++ в *nix-системах / Александр Алексеев (Postgres P...
Ontico
Code Sharing - Как мы пришли к Unity Package Manager / Станислав Коротаев (Ba...
Code Sharing - Как мы пришли к Unity Package Manager / Станислав Коротаев (Ba...Code Sharing - Как мы пришли к Unity Package Manager / Станислав Коротаев (Ba...
Code Sharing - Как мы пришли к Unity Package Manager / Станислав Коротаев (Ba...
DevGAMM Conference
2016-09-17 02 Игорь Гончаровский. Техническая и программная сторона VoIP
2016-09-17 02 Игорь Гончаровский. Техническая и программная сторона VoIP2016-09-17 02 Игорь Гончаровский. Техническая и программная сторона VoIP
2016-09-17 02 Игорь Гончаровский. Техническая и программная сторона VoIP
Омские ИТ-субботники
Windbg: когда у нас не воспроизводится. Александр Головач ➠ CoreHard Autumn ...
Windbg: когда у нас не воспроизводится. Александр Головач ➠  CoreHard Autumn ...Windbg: когда у нас не воспроизводится. Александр Головач ➠  CoreHard Autumn ...
Windbg: когда у нас не воспроизводится. Александр Головач ➠ CoreHard Autumn ...
corehard_by
Михаил Коробов: Как перейти на Python 3
Михаил Коробов: Как перейти на Python 3Михаил Коробов: Как перейти на Python 3
Михаил Коробов: Как перейти на Python 3
it-people
Применение фреймворка GStreamer в системе видеонаблюдения
Применение фреймворка GStreamer в системе видеонаблюденияПрименение фреймворка GStreamer в системе видеонаблюдения
Применение фреймворка GStreamer в системе видеонаблюдения
corehard_by
Сравнение технологий aiopg & asyncpg, Алексей Фирсов. 22 июня, 2019
Сравнение технологий aiopg & asyncpg, Алексей Фирсов. 22 июня, 2019Сравнение технологий aiopg & asyncpg, Алексей Фирсов. 22 июня, 2019
Сравнение технологий aiopg & asyncpg, Алексей Фирсов. 22 июня, 2019
Mail.ru Group

More from corehard_by (20)

C++ CoreHard Autumn 2018. Создание пакетов для открытых библиотек через conan...
C++ CoreHard Autumn 2018. Создание пакетов для открытых библиотек через conan...C++ CoreHard Autumn 2018. Создание пакетов для открытых библиотек через conan...
C++ CoreHard Autumn 2018. Создание пакетов для открытых библиотек через conan...
corehard_by
C++ CoreHard Autumn 2018. Что должен знать каждый C++ программист или Как про...
C++ CoreHard Autumn 2018. Что должен знать каждый C++ программист или Как про...C++ CoreHard Autumn 2018. Что должен знать каждый C++ программист или Как про...
C++ CoreHard Autumn 2018. Что должен знать каждый C++ программист или Как про...
corehard_by
C++ CoreHard Autumn 2018. Actors vs CSP vs Tasks vs ... - Евгений Охотников
C++ CoreHard Autumn 2018. Actors vs CSP vs Tasks vs ... - Евгений ОхотниковC++ CoreHard Autumn 2018. Actors vs CSP vs Tasks vs ... - Евгений Охотников
C++ CoreHard Autumn 2018. Actors vs CSP vs Tasks vs ... - Евгений Охотников
corehard_by
C++ CoreHard Autumn 2018. Знай свое "железо": иерархия памяти - Александр Титов
C++ CoreHard Autumn 2018. Знай свое "железо": иерархия памяти - Александр ТитовC++ CoreHard Autumn 2018. Знай свое "железо": иерархия памяти - Александр Титов
C++ CoreHard Autumn 2018. Знай свое "железо": иерархия памяти - Александр Титов
corehard_by
C++ CoreHard Autumn 2018. Информационная безопасность и разработка ПО - Евген...
C++ CoreHard Autumn 2018. Информационная безопасность и разработка ПО - Евген...C++ CoreHard Autumn 2018. Информационная безопасность и разработка ПО - Евген...
C++ CoreHard Autumn 2018. Информационная безопасность и разработка ПО - Евген...
corehard_by
C++ CoreHard Autumn 2018. Заглядываем под капот «Поясов по C++» - Илья Шишков
C++ CoreHard Autumn 2018. Заглядываем под капот «Поясов по C++» - Илья ШишковC++ CoreHard Autumn 2018. Заглядываем под капот «Поясов по C++» - Илья Шишков
C++ CoreHard Autumn 2018. Заглядываем под капот «Поясов по C++» - Илья Шишков
corehard_by
C++ CoreHard Autumn 2018. Ускорение сборки C++ проектов, способы и последстви...
C++ CoreHard Autumn 2018. Ускорение сборки C++ проектов, способы и последстви...C++ CoreHard Autumn 2018. Ускорение сборки C++ проектов, способы и последстви...
C++ CoreHard Autumn 2018. Ускорение сборки C++ проектов, способы и последстви...
corehard_by
C++ CoreHard Autumn 2018. Метаклассы: воплощаем мечты в реальность - Сергей С...
C++ CoreHard Autumn 2018. Метаклассы: воплощаем мечты в реальность - Сергей С...C++ CoreHard Autumn 2018. Метаклассы: воплощаем мечты в реальность - Сергей С...
C++ CoreHard Autumn 2018. Метаклассы: воплощаем мечты в реальность - Сергей С...
corehard_by
C++ CoreHard Autumn 2018. Кодогенерация C++ кроссплатформенно. Продолжение - ...
C++ CoreHard Autumn 2018. Кодогенерация C++ кроссплатформенно. Продолжение - ...C++ CoreHard Autumn 2018. Кодогенерация C++ кроссплатформенно. Продолжение - ...
C++ CoreHard Autumn 2018. Кодогенерация C++ кроссплатформенно. Продолжение - ...
corehard_by
C++ CoreHard Autumn 2018. Concurrency and Parallelism in C++17 and C++20/23 -...
C++ CoreHard Autumn 2018. Concurrency and Parallelism in C++17 and C++20/23 -...C++ CoreHard Autumn 2018. Concurrency and Parallelism in C++17 and C++20/23 -...
C++ CoreHard Autumn 2018. Concurrency and Parallelism in C++17 and C++20/23 -...
corehard_by
C++ CoreHard Autumn 2018. Обработка списков на C++ в функциональном стиле - В...
C++ CoreHard Autumn 2018. Обработка списков на C++ в функциональном стиле - В...C++ CoreHard Autumn 2018. Обработка списков на C++ в функциональном стиле - В...
C++ CoreHard Autumn 2018. Обработка списков на C++ в функциональном стиле - В...
corehard_by
C++ Corehard Autumn 2018. Обучаем на Python, применяем на C++ - Павел Филонов
C++ Corehard Autumn 2018. Обучаем на Python, применяем на C++ - Павел ФилоновC++ Corehard Autumn 2018. Обучаем на Python, применяем на C++ - Павел Филонов
C++ Corehard Autumn 2018. Обучаем на Python, применяем на C++ - Павел Филонов
corehard_by
C++ CoreHard Autumn 2018. Asynchronous programming with ranges - Ivan Čukić
C++ CoreHard Autumn 2018. Asynchronous programming with ranges - Ivan ČukićC++ CoreHard Autumn 2018. Asynchronous programming with ranges - Ivan Čukić
C++ CoreHard Autumn 2018. Asynchronous programming with ranges - Ivan Čukić
corehard_by
C++ CoreHard Autumn 2018. Debug C++ Without Running - Anastasia Kazakova
C++ CoreHard Autumn 2018. Debug C++ Without Running - Anastasia KazakovaC++ CoreHard Autumn 2018. Debug C++ Without Running - Anastasia Kazakova
C++ CoreHard Autumn 2018. Debug C++ Without Running - Anastasia Kazakova
corehard_by
C++ CoreHard Autumn 2018. Полезный constexpr - Антон Полухин
C++ CoreHard Autumn 2018. Полезный constexpr - Антон ПолухинC++ CoreHard Autumn 2018. Полезный constexpr - Антон Полухин
C++ CoreHard Autumn 2018. Полезный constexpr - Антон Полухин
corehard_by
C++ CoreHard Autumn 2018. Text Formatting For a Future Range-Based Standard L...
C++ CoreHard Autumn 2018. Text Formatting For a Future Range-Based Standard L...C++ CoreHard Autumn 2018. Text Formatting For a Future Range-Based Standard L...
C++ CoreHard Autumn 2018. Text Formatting For a Future Range-Based Standard L...
corehard_by
Исключительная модель памяти. Алексей Ткаченко ➠ CoreHard Autumn 2019
Исключительная модель памяти. Алексей Ткаченко ➠ CoreHard Autumn 2019Исключительная модель памяти. Алексей Ткаченко ➠ CoreHard Autumn 2019
Исключительная модель памяти. Алексей Ткаченко ➠ CoreHard Autumn 2019
corehard_by
Как помочь и как помешать компилятору. Андрей Олейников ➠ CoreHard Autumn 2019
Как помочь и как помешать компилятору. Андрей Олейников ➠  CoreHard Autumn 2019Как помочь и как помешать компилятору. Андрей Олейников ➠  CoreHard Autumn 2019
Как помочь и как помешать компилятору. Андрей Олейников ➠ CoreHard Autumn 2019
corehard_by
Автоматизируй это. Кирилл Тихонов ➠ CoreHard Autumn 2019
Автоматизируй это. Кирилл Тихонов ➠  CoreHard Autumn 2019Автоматизируй это. Кирилл Тихонов ➠  CoreHard Autumn 2019
Автоматизируй это. Кирилл Тихонов ➠ CoreHard Autumn 2019
corehard_by
Статичный SQL в С++14. Евгений Захаров ➠ CoreHard Autumn 2019
Статичный SQL в С++14. Евгений Захаров ➠  CoreHard Autumn 2019Статичный SQL в С++14. Евгений Захаров ➠  CoreHard Autumn 2019
Статичный SQL в С++14. Евгений Захаров ➠ CoreHard Autumn 2019
corehard_by
C++ CoreHard Autumn 2018. Создание пакетов для открытых библиотек через conan...
C++ CoreHard Autumn 2018. Создание пакетов для открытых библиотек через conan...C++ CoreHard Autumn 2018. Создание пакетов для открытых библиотек через conan...
C++ CoreHard Autumn 2018. Создание пакетов для открытых библиотек через conan...
corehard_by
C++ CoreHard Autumn 2018. Что должен знать каждый C++ программист или Как про...
C++ CoreHard Autumn 2018. Что должен знать каждый C++ программист или Как про...C++ CoreHard Autumn 2018. Что должен знать каждый C++ программист или Как про...
C++ CoreHard Autumn 2018. Что должен знать каждый C++ программист или Как про...
corehard_by
C++ CoreHard Autumn 2018. Actors vs CSP vs Tasks vs ... - Евгений Охотников
C++ CoreHard Autumn 2018. Actors vs CSP vs Tasks vs ... - Евгений ОхотниковC++ CoreHard Autumn 2018. Actors vs CSP vs Tasks vs ... - Евгений Охотников
C++ CoreHard Autumn 2018. Actors vs CSP vs Tasks vs ... - Евгений Охотников
corehard_by
C++ CoreHard Autumn 2018. Знай свое "железо": иерархия памяти - Александр Титов
C++ CoreHard Autumn 2018. Знай свое "железо": иерархия памяти - Александр ТитовC++ CoreHard Autumn 2018. Знай свое "железо": иерархия памяти - Александр Титов
C++ CoreHard Autumn 2018. Знай свое "железо": иерархия памяти - Александр Титов
corehard_by
C++ CoreHard Autumn 2018. Информационная безопасность и разработка ПО - Евген...
C++ CoreHard Autumn 2018. Информационная безопасность и разработка ПО - Евген...C++ CoreHard Autumn 2018. Информационная безопасность и разработка ПО - Евген...
C++ CoreHard Autumn 2018. Информационная безопасность и разработка ПО - Евген...
corehard_by
C++ CoreHard Autumn 2018. Заглядываем под капот «Поясов по C++» - Илья Шишков
C++ CoreHard Autumn 2018. Заглядываем под капот «Поясов по C++» - Илья ШишковC++ CoreHard Autumn 2018. Заглядываем под капот «Поясов по C++» - Илья Шишков
C++ CoreHard Autumn 2018. Заглядываем под капот «Поясов по C++» - Илья Шишков
corehard_by
C++ CoreHard Autumn 2018. Ускорение сборки C++ проектов, способы и последстви...
C++ CoreHard Autumn 2018. Ускорение сборки C++ проектов, способы и последстви...C++ CoreHard Autumn 2018. Ускорение сборки C++ проектов, способы и последстви...
C++ CoreHard Autumn 2018. Ускорение сборки C++ проектов, способы и последстви...
corehard_by
C++ CoreHard Autumn 2018. Метаклассы: воплощаем мечты в реальность - Сергей С...
C++ CoreHard Autumn 2018. Метаклассы: воплощаем мечты в реальность - Сергей С...C++ CoreHard Autumn 2018. Метаклассы: воплощаем мечты в реальность - Сергей С...
C++ CoreHard Autumn 2018. Метаклассы: воплощаем мечты в реальность - Сергей С...
corehard_by
C++ CoreHard Autumn 2018. Кодогенерация C++ кроссплатформенно. Продолжение - ...
C++ CoreHard Autumn 2018. Кодогенерация C++ кроссплатформенно. Продолжение - ...C++ CoreHard Autumn 2018. Кодогенерация C++ кроссплатформенно. Продолжение - ...
C++ CoreHard Autumn 2018. Кодогенерация C++ кроссплатформенно. Продолжение - ...
corehard_by
C++ CoreHard Autumn 2018. Concurrency and Parallelism in C++17 and C++20/23 -...
C++ CoreHard Autumn 2018. Concurrency and Parallelism in C++17 and C++20/23 -...C++ CoreHard Autumn 2018. Concurrency and Parallelism in C++17 and C++20/23 -...
C++ CoreHard Autumn 2018. Concurrency and Parallelism in C++17 and C++20/23 -...
corehard_by
C++ CoreHard Autumn 2018. Обработка списков на C++ в функциональном стиле - В...
C++ CoreHard Autumn 2018. Обработка списков на C++ в функциональном стиле - В...C++ CoreHard Autumn 2018. Обработка списков на C++ в функциональном стиле - В...
C++ CoreHard Autumn 2018. Обработка списков на C++ в функциональном стиле - В...
corehard_by
C++ Corehard Autumn 2018. Обучаем на Python, применяем на C++ - Павел Филонов
C++ Corehard Autumn 2018. Обучаем на Python, применяем на C++ - Павел ФилоновC++ Corehard Autumn 2018. Обучаем на Python, применяем на C++ - Павел Филонов
C++ Corehard Autumn 2018. Обучаем на Python, применяем на C++ - Павел Филонов
corehard_by
C++ CoreHard Autumn 2018. Asynchronous programming with ranges - Ivan Čukić
C++ CoreHard Autumn 2018. Asynchronous programming with ranges - Ivan ČukićC++ CoreHard Autumn 2018. Asynchronous programming with ranges - Ivan Čukić
C++ CoreHard Autumn 2018. Asynchronous programming with ranges - Ivan Čukić
corehard_by
C++ CoreHard Autumn 2018. Debug C++ Without Running - Anastasia Kazakova
C++ CoreHard Autumn 2018. Debug C++ Without Running - Anastasia KazakovaC++ CoreHard Autumn 2018. Debug C++ Without Running - Anastasia Kazakova
C++ CoreHard Autumn 2018. Debug C++ Without Running - Anastasia Kazakova
corehard_by
C++ CoreHard Autumn 2018. Полезный constexpr - Антон Полухин
C++ CoreHard Autumn 2018. Полезный constexpr - Антон ПолухинC++ CoreHard Autumn 2018. Полезный constexpr - Антон Полухин
C++ CoreHard Autumn 2018. Полезный constexpr - Антон Полухин
corehard_by
C++ CoreHard Autumn 2018. Text Formatting For a Future Range-Based Standard L...
C++ CoreHard Autumn 2018. Text Formatting For a Future Range-Based Standard L...C++ CoreHard Autumn 2018. Text Formatting For a Future Range-Based Standard L...
C++ CoreHard Autumn 2018. Text Formatting For a Future Range-Based Standard L...
corehard_by
Исключительная модель памяти. Алексей Ткаченко ➠ CoreHard Autumn 2019
Исключительная модель памяти. Алексей Ткаченко ➠ CoreHard Autumn 2019Исключительная модель памяти. Алексей Ткаченко ➠ CoreHard Autumn 2019
Исключительная модель памяти. Алексей Ткаченко ➠ CoreHard Autumn 2019
corehard_by
Как помочь и как помешать компилятору. Андрей Олейников ➠ CoreHard Autumn 2019
Как помочь и как помешать компилятору. Андрей Олейников ➠  CoreHard Autumn 2019Как помочь и как помешать компилятору. Андрей Олейников ➠  CoreHard Autumn 2019
Как помочь и как помешать компилятору. Андрей Олейников ➠ CoreHard Autumn 2019
corehard_by
Автоматизируй это. Кирилл Тихонов ➠ CoreHard Autumn 2019
Автоматизируй это. Кирилл Тихонов ➠  CoreHard Autumn 2019Автоматизируй это. Кирилл Тихонов ➠  CoreHard Autumn 2019
Автоматизируй это. Кирилл Тихонов ➠ CoreHard Autumn 2019
corehard_by
Статичный SQL в С++14. Евгений Захаров ➠ CoreHard Autumn 2019
Статичный SQL в С++14. Евгений Захаров ➠  CoreHard Autumn 2019Статичный SQL в С++14. Евгений Захаров ➠  CoreHard Autumn 2019
Статичный SQL в С++14. Евгений Захаров ➠ CoreHard Autumn 2019
corehard_by

Инструменты профайлинга С++ кода

  • 1. Профайлинг в C++ Обзор ПО для профилирования
  • 2. О себе ● С++ разработчик в SolarWinds ● Участвую в деятельности Российской РГ21 ● Разработчик Boost.Algorithm и gImageReader ● zamazan4ik везде - Telegram, Twitter, GitHub, Reddit, etc. ● https://github.com/ZaMaZaN4iK
  • 3. Постановка проблемы ● Есть приложение ● Оно тормозит ● Мы хотим (нас заставляют) это исправить ● А мы понятия не имеем, с какой стороны подступиться ● Искать руками долго/лень/сроки поджимают/что-то ещё (нужное подчеркнуть)
  • 4. Профилирование, профилировщики и т.д. ● Профилирование служит для получения информации о работе программы в целом: какие функции сколько времени выполняются, нахождение «горячих» мест и других особенностей работы программы ● Профилировщик - инструмент, который занимается профилировкой
  • 5. Классификация ПО ● Эмуляторысимуляторы ● Сэмплеры ● Ручные (да-да, так тоже можно :) ● Event-based
  • 6. Сэмплеры ● Регулярно «срезают» ресурсы программы ● Почти не влияют на скорость выполнения (зависит от частоты) ● Некоторые функции пропадают :-) ● Погрешности
  • 7. Эмуляторы ● Эмуляция профилируемого устройства ● Значительное замедление программы ● Функции не пропадают :-) ● Сложность реализации ● Соответствие реальному аппаратному обеспечению (нет)
  • 8. Проблемы ● Разные производители процессоров (Intel, AMD, etc.) ● Разные архитектуры ● Разные ОС (GNU/Linux-based, Windows, macOS, Android, iOS, etc.)
  • 9. gprof ● GNU/Linux ● Консольный интерфейс ● Требует перекомпиляции проекта ● Профилирует только user-space код ● Не может профилировать многопоточные приложения ● https://sourceware.org/binutils/docs/gprof/
  • 10. gprof: как использовать 1. Пишем программу 2. Компилируем с флагом “pg” 3. Запускаем программу 4. Запускаем gprof с получившимся файлом 5. Анализируем результат
  • 11. gcov ● Консольный интерфейс ● Считает покрытие тестами кода ● Но оказывается тоже может профилировать! ● Занимается line-by-line профилированием
  • 12. gcov: как использовать для профилирования 1. Пишем программу 2. Компилируем её с флагами “-fprofile-arcs -ftest-coverage” 3. Запускаем программу (появятся файлы для gcov) 4. Запускаем gcov с файлом исходного кода 5. Анализируем результат
  • 13. gprof2dot ● Написан на Python 3 ● Понадобится Graphviz - https://www.graphviz.org/ ● Конвертер в dot graph ● Поддерживает: perf, callgrind, oprofile, sysprof, Vtune, prof, gprof, xperf, Very Sleepy ● https://github.com/jrfonseca/gprof2dot
  • 15. gprof2dot: примеры использования ● gprof path/to/your/executable | gprof2dot.py | dot -Tpng -o output.png ● perf record -g -- /path/to/your/executable perf script | c++filt | gprof2dot.py -f perf | dot -Tpng -o output.png ● amplxe-cl -report gprof-cc -result-dir output -format text -report-output output.txt gprof2dot.py -f axe output.txt | dot -Tpng -o output.png
  • 16. gperftools (Google Performance Tools) ● GNULinux, … ● Умеет в многопоточные приложения ● Ручная разметка интересующих вас мест для профилирования ● Крайне низкие накладные расходы ● https://github.com/gperftools/gperftools
  • 17. gperftools: как использовать 1. Написать программу, подключить <gperftools/profiler.h> 2. Пометить интересующие вас места ProfilerStart(“file.log”)/ProfilerStop() 3. Скомпилировать с отладочными символами 4. Слинковать с profiler.so 5. Запустить 6. Полученный file.log конвертировать в тот же callgrind: a. pprof --callgrind ./test file.log > profile.callgrind
  • 18. Valgrind ● Эмулятор ● GNU/Linux, macOS ● Open-Source ● Утилиты: Cachegrind, Callgrind, DRD, Helgrind, Massif, Memcheck ● Расширяемость ● http://valgrind.org/
  • 19. Valgrind: особенности ● Очень сильно замедляет работу программы ○ 10-50x ○ Зависит от утилиты и настроек ● Старается эмулировать процессор ○ Branch-prediction на уровне процессоров 2004 года ○ Попытки смоделировать ваш кеш (гадает по CPUID) ○ Если не смог подобрать под Ваш процессор, то… всё грустно ○ Можете ему помочь и сами написать свою реализацию кеша :)
  • 20. kcachegrind/qcachegrind ● Платформы ○ kcachegrind: GNU/Linux ○ qcachegrind: GNU/Linux, Windows, macOS ● Программа для просмотра “выхлопа” профилировщика ● https://github.com/KDE/kcachegrind
  • 22. Heaptrack ● https://github.com/KDE/heaptrack ● Linux-only ● GUI + консольный интерфейс ● Профилирует и визуализирует: ○ Динамику потребления памяти во времени ○ Пиковые потребления ○ Количество “утёкшей” памяти ○ Распределение потребления памяти по функциям ○ Flame Graph потребления памяти
  • 24. FlameGraph ● Визуализация стека чего-нибудь ● Не ограничена только CPU (Memory, IO) ● Интерактивно ● Кастомизируемо ● Хорошая поддержка профилировщиков ● https://github.com/brendangregg/FlameGraph (аккуратно - Perl)
  • 26. Intel VTune Amplifier ● От Intel ● Проприетарный ● GNU/Linux, Windows, macOS (только как хост) ● Уже бесплатный для коммерческого использования ● GUI (Eclipse) + командная строка ● Только на CPU от Intel
  • 27. VTune: что умеет ● Hotspot analysis ● Concurrency profiling ● Cache profiling ● Branch-prediction profiling ● GPU profiling ● Disk IO profiling
  • 29. CodeXL ● От AMD ● Работает с CPU от AMD ● https://github.com/GPUOpen-Tools/CodeXL ● GNU/Linux, Windows ● Бывают баги
  • 31. CodeXL: функционал ● Cache line utilization ● Instruction-based sampling ● Branch profiling ● Data access profiling ● Time-based sampling ● Instruction access ● Call graph ● Power profiling ● GPU profiling
  • 32. Xcode + Instruments ● Идёт в комплекте с Xcode ● В ряде случаев использует “под капотом” DTrace ● Умеет профилировать приложения на macOS, iOS ● Time profiler, memory profiler ● Wi-Fi, GPS, Energy, etc. (iOS)
  • 34. SimplePerf (+ Android Studio 3.1) ● Профайлер для Android ● Консольный интерфейс ● https://android.googlesource.com/platform/system/extras/+/master/simpleperf ● Начиная с Android 3.1 может профилировать C++ код прямо из IDE ○ Требует Android 8 (API Level 26) и выше
  • 35. Остались за рамками доклада (извините) ● OProfile - http://oprofile.sourceforge.net ● TAU - https://www.cs.uoregon.edu/research/tau/home.php ● LTTng - https://lttng.org/ ● xperf - https://docs.microsoft.com/en-us/windows-hardware/test/wpt/ ● GlowCode - https://www.glowcode.com/ ● DS-5 (built-in profiler) - https://developer.arm.com/ ● Visual Studio (built-in profiler) ● Oracle Developer Studio (built-in profiler) ● Intel IACA ● DTrace - <link>
  • 36. Советы ● Не оптимизируйте без профилирования ● Выбирайте профайлер внимательно ● Изучите профайлер перед использованием
  • 37. Полезные ссылки ● https://eax.me/c-cpp-profiling ● https://github.com/fenbf/AwesomePerfCpp ● https://software.intel.com/en-us/vtune-amplifier-help ● http://www.brendangregg.com