SlideShare a Scribd company logo
1 of 38
Профайлинг в 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

Илья Ковалевский "Что такое Qt и что с ним можно сделать"
Илья Ковалевский "Что такое Qt и что с ним можно сделать"Илья Ковалевский "Что такое Qt и что с ним можно сделать"
Илья Ковалевский "Что такое Qt и что с ним можно сделать"Dmitry Savchenko
 
системы автоматизированного перевода
системы автоматизированного переводасистемы автоматизированного перевода
системы автоматизированного переводаMariaSuina
 
Антон Довгоброд: Highload и очереди задач на примере PHP + Gearman + Yii2
Антон Довгоброд: Highload и очереди задач на примере PHP + Gearman + Yii2Антон Довгоброд: Highload и очереди задач на примере PHP + Gearman + Yii2
Антон Довгоброд: Highload и очереди задач на примере PHP + Gearman + Yii2Oleg Poludnenko
 
Test traffic 100G generator and analyzer
Test traffic 100G generator and analyzerTest traffic 100G generator and analyzer
Test traffic 100G generator and analyzerishevchuk
 
Sampling profiling
Sampling profilingSampling profiling
Sampling profilingSlach
 
Как писать на PHP и не стать быдло-кодером
Как писать на PHP и не стать быдло-кодеромКак писать на PHP и не стать быдло-кодером
Как писать на PHP и не стать быдло-кодеромKirill Kovalchuk
 
Как мы делаем раскладку Календаря@Mail.Ru
Как мы делаем раскладку Календаря@Mail.RuКак мы делаем раскладку Календаря@Mail.Ru
Как мы делаем раскладку Календаря@Mail.RuVladimir Rudnyh
 
Дизайн платформа в Avito - Александр Лобашев (Avito)
Дизайн платформа в Avito - Александр Лобашев (Avito)Дизайн платформа в Avito - Александр Лобашев (Avito)
Дизайн платформа в Avito - Александр Лобашев (Avito)AvitoTech
 
Незаменимый С++. Антон Полухин. CoreHard Spring 2019
Незаменимый С++. Антон Полухин. CoreHard Spring 2019Незаменимый С++. Антон Полухин. CoreHard Spring 2019
Незаменимый С++. Антон Полухин. CoreHard Spring 2019corehard_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...Омские ИТ-субботники
 

What's hot (13)

Илья Ковалевский "Что такое Qt и что с ним можно сделать"
Илья Ковалевский "Что такое Qt и что с ним можно сделать"Илья Ковалевский "Что такое Qt и что с ним можно сделать"
Илья Ковалевский "Что такое Qt и что с ним можно сделать"
 
системы автоматизированного перевода
системы автоматизированного переводасистемы автоматизированного перевода
системы автоматизированного перевода
 
Антон Довгоброд: Highload и очереди задач на примере PHP + Gearman + Yii2
Антон Довгоброд: Highload и очереди задач на примере PHP + Gearman + Yii2Антон Довгоброд: Highload и очереди задач на примере PHP + Gearman + Yii2
Антон Довгоброд: Highload и очереди задач на примере PHP + Gearman + Yii2
 
Test traffic 100G generator and analyzer
Test traffic 100G generator and analyzerTest traffic 100G generator and analyzer
Test traffic 100G generator and analyzer
 
Sampling profiling
Sampling profilingSampling profiling
Sampling profiling
 
Как писать на PHP и не стать быдло-кодером
Как писать на PHP и не стать быдло-кодеромКак писать на PHP и не стать быдло-кодером
Как писать на PHP и не стать быдло-кодером
 
Как мы делаем раскладку Календаря@Mail.Ru
Как мы делаем раскладку Календаря@Mail.RuКак мы делаем раскладку Календаря@Mail.Ru
Как мы делаем раскладку Календаря@Mail.Ru
 
Дизайн платформа в Avito - Александр Лобашев (Avito)
Дизайн платформа в Avito - Александр Лобашев (Avito)Дизайн платформа в Avito - Александр Лобашев (Avito)
Дизайн платформа в Avito - Александр Лобашев (Avito)
 
Markelov-AUG-Jira
Markelov-AUG-JiraMarkelov-AUG-Jira
Markelov-AUG-Jira
 
Незаменимый С++. Антон Полухин. CoreHard Spring 2019
Незаменимый С++. Антон Полухин. CoreHard Spring 2019Незаменимый С++. Антон Полухин. CoreHard Spring 2019
Незаменимый С++. Антон Полухин. CoreHard Spring 2019
 
Rempl — крутая платформа для крутых инструментов - Роман Дворнов (Avito)
Rempl — крутая платформа для крутых инструментов - Роман Дворнов (Avito)Rempl — крутая платформа для крутых инструментов - Роман Дворнов (Avito)
Rempl — крутая платформа для крутых инструментов - Роман Дворнов (Avito)
 
Повышаем и следим за качеством PHP кода
Повышаем и следим за качеством PHP кодаПовышаем и следим за качеством PHP кода
Повышаем и следим за качеством PHP кода
 
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 Инструменты профайлинга С++ кода

Как перезапустить проблемное приложение и одновременно отладить его
Как перезапустить проблемное приложение и одновременно отладить егоКак перезапустить проблемное приложение и одновременно отладить его
Как перезапустить проблемное приложение и одновременно отладить егоOlga Rusakova
 
Разработка декстопных приложений для linux (Владимир Яковлев)
Разработка декстопных приложений для linux (Владимир Яковлев)Разработка декстопных приложений для linux (Владимир Яковлев)
Разработка декстопных приложений для linux (Владимир Яковлев)IT-Доминанта
 
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 NovgorodNikita Baksalyar
 
Презентация про DTrace на ADDconf в Минске
Презентация про DTrace на ADDconf в МинскеПрезентация про DTrace на ADDconf в Минске
Презентация про DTrace на ADDconf в МинскеAlex Chistyakov
 
Применение DTrace для оптимизации производительности на примере двух больших ...
Применение DTrace для оптимизации производительности на примере двух больших ...Применение DTrace для оптимизации производительности на примере двух больших ...
Применение DTrace для оптимизации производительности на примере двух больших ...SQALab
 
Создаем Drupal дистрибутив: от идеи до сопровождения.
Создаем Drupal дистрибутив: от идеи до сопровождения.Создаем Drupal дистрибутив: от идеи до сопровождения.
Создаем Drupal дистрибутив: от идеи до сопровождения.DrupalForumZP2012
 
Rust - GDG DevFest Siberia 2016
Rust - GDG DevFest Siberia 2016Rust - GDG DevFest Siberia 2016
Rust - GDG DevFest Siberia 2016Nikita 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
 
Михаил Коробов: Как перейти на Python 3
Михаил Коробов: Как перейти на Python 3Михаил Коробов: Как перейти на Python 3
Михаил Коробов: Как перейти на Python 3it-people
 
Применение фреймворка GStreamer в системе видеонаблюдения
Применение фреймворка GStreamer в системе видеонаблюденияПрименение фреймворка GStreamer в системе видеонаблюдения
Применение фреймворка GStreamer в системе видеонаблюденияcorehard_by
 
Сравнение технологий aiopg & asyncpg, Алексей Фирсов. 22 июня, 2019
Сравнение технологий aiopg & asyncpg, Алексей Фирсов. 22 июня, 2019Сравнение технологий aiopg & asyncpg, Алексей Фирсов. 22 июня, 2019
Сравнение технологий aiopg & asyncpg, Алексей Фирсов. 22 июня, 2019Mail.ru Group
 

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

Как перезапустить проблемное приложение и одновременно отладить его
Как перезапустить проблемное приложение и одновременно отладить егоКак перезапустить проблемное приложение и одновременно отладить его
Как перезапустить проблемное приложение и одновременно отладить его
 
Разработка декстопных приложений для linux (Владимир Яковлев)
Разработка декстопных приложений для linux (Владимир Яковлев)Разработка декстопных приложений для linux (Владимир Яковлев)
Разработка декстопных приложений для linux (Владимир Яковлев)
 
SWIG — cоздание мультиязыковых интерфейсов для C/C++ библиотек
SWIG — cоздание мультиязыковых интерфейсов для C/C++ библиотекSWIG — cоздание мультиязыковых интерфейсов для C/C++ библиотек
SWIG — cоздание мультиязыковых интерфейсов для C/C++ библиотек
 
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
 
Презентация про DTrace на ADDconf в Минске
Презентация про DTrace на ADDconf в МинскеПрезентация про DTrace на ADDconf в Минске
Презентация про DTrace на ADDconf в Минске
 
Применение DTrace для оптимизации производительности на примере двух больших ...
Применение DTrace для оптимизации производительности на примере двух больших ...Применение DTrace для оптимизации производительности на примере двух больших ...
Применение DTrace для оптимизации производительности на примере двух больших ...
 
Use Grunt Luke
Use Grunt LukeUse Grunt Luke
Use Grunt Luke
 
Создаем Drupal дистрибутив: от идеи до сопровождения.
Создаем Drupal дистрибутив: от идеи до сопровождения.Создаем Drupal дистрибутив: от идеи до сопровождения.
Создаем Drupal дистрибутив: от идеи до сопровождения.
 
Rust - GDG DevFest Siberia 2016
Rust - GDG DevFest Siberia 2016Rust - GDG DevFest Siberia 2016
Rust - GDG DevFest Siberia 2016
 
Kranonit s16 (python). sergey burma
Kranonit s16 (python). sergey burmaKranonit s16 (python). sergey burma
Kranonit s16 (python). sergey burma
 
Руслан Исай. Drupal - это для программистов
Руслан Исай. Drupal  - это для программистовРуслан Исай. Drupal  - это для программистов
Руслан Исай. Drupal - это для программистов
 
Профилирование кода на C/C++ в *nix-системах / Александр Алексеев (Postgres P...
Профилирование кода на C/C++ в *nix-системах / Александр Алексеев (Postgres P...Профилирование кода на C/C++ в *nix-системах / Александр Алексеев (Postgres P...
Профилирование кода на C/C++ в *nix-системах / Александр Алексеев (Postgres P...
 
Code Sharing - Как мы пришли к Unity Package Manager / Станислав Коротаев (Ba...
Code Sharing - Как мы пришли к Unity Package Manager / Станислав Коротаев (Ba...Code Sharing - Как мы пришли к Unity Package Manager / Станислав Коротаев (Ba...
Code Sharing - Как мы пришли к Unity Package Manager / Станислав Коротаев (Ba...
 
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 ...
 
Lime.JS
Lime.JSLime.JS
Lime.JS
 
Михаил Коробов: Как перейти на Python 3
Михаил Коробов: Как перейти на Python 3Михаил Коробов: Как перейти на Python 3
Михаил Коробов: Как перейти на Python 3
 
Применение фреймворка GStreamer в системе видеонаблюдения
Применение фреймворка GStreamer в системе видеонаблюденияПрименение фреймворка GStreamer в системе видеонаблюдения
Применение фреймворка GStreamer в системе видеонаблюдения
 
Сравнение технологий aiopg & asyncpg, Алексей Фирсов. 22 июня, 2019
Сравнение технологий aiopg & asyncpg, Алексей Фирсов. 22 июня, 2019Сравнение технологий aiopg & asyncpg, Алексей Фирсов. 22 июня, 2019
Сравнение технологий aiopg & asyncpg, Алексей Фирсов. 22 июня, 2019
 

More from 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 Kazakovacorehard_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 2019corehard_by
 
Как помочь и как помешать компилятору. Андрей Олейников ➠ CoreHard Autumn 2019
Как помочь и как помешать компилятору. Андрей Олейников ➠  CoreHard Autumn 2019Как помочь и как помешать компилятору. Андрей Олейников ➠  CoreHard Autumn 2019
Как помочь и как помешать компилятору. Андрей Олейников ➠ CoreHard Autumn 2019corehard_by
 
Автоматизируй это. Кирилл Тихонов ➠ CoreHard Autumn 2019
Автоматизируй это. Кирилл Тихонов ➠  CoreHard Autumn 2019Автоматизируй это. Кирилл Тихонов ➠  CoreHard Autumn 2019
Автоматизируй это. Кирилл Тихонов ➠ CoreHard Autumn 2019corehard_by
 
Статичный SQL в С++14. Евгений Захаров ➠ CoreHard Autumn 2019
Статичный SQL в С++14. Евгений Захаров ➠  CoreHard Autumn 2019Статичный SQL в С++14. Евгений Захаров ➠  CoreHard Autumn 2019
Статичный SQL в С++14. Евгений Захаров ➠ CoreHard Autumn 2019corehard_by
 

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...
 
C++ CoreHard Autumn 2018. Что должен знать каждый C++ программист или Как про...
C++ CoreHard Autumn 2018. Что должен знать каждый C++ программист или Как про...C++ CoreHard Autumn 2018. Что должен знать каждый C++ программист или Как про...
C++ CoreHard Autumn 2018. Что должен знать каждый C++ программист или Как про...
 
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 ... - Евгений Охотников
 
C++ CoreHard Autumn 2018. Знай свое "железо": иерархия памяти - Александр Титов
C++ CoreHard Autumn 2018. Знай свое "железо": иерархия памяти - Александр ТитовC++ CoreHard Autumn 2018. Знай свое "железо": иерархия памяти - Александр Титов
C++ CoreHard Autumn 2018. Знай свое "железо": иерархия памяти - Александр Титов
 
C++ CoreHard Autumn 2018. Информационная безопасность и разработка ПО - Евген...
C++ CoreHard Autumn 2018. Информационная безопасность и разработка ПО - Евген...C++ CoreHard Autumn 2018. Информационная безопасность и разработка ПО - Евген...
C++ CoreHard Autumn 2018. Информационная безопасность и разработка ПО - Евген...
 
C++ CoreHard Autumn 2018. Заглядываем под капот «Поясов по C++» - Илья Шишков
C++ CoreHard Autumn 2018. Заглядываем под капот «Поясов по C++» - Илья ШишковC++ CoreHard Autumn 2018. Заглядываем под капот «Поясов по C++» - Илья Шишков
C++ CoreHard Autumn 2018. Заглядываем под капот «Поясов по C++» - Илья Шишков
 
C++ CoreHard Autumn 2018. Ускорение сборки C++ проектов, способы и последстви...
C++ CoreHard Autumn 2018. Ускорение сборки C++ проектов, способы и последстви...C++ CoreHard Autumn 2018. Ускорение сборки C++ проектов, способы и последстви...
C++ CoreHard Autumn 2018. Ускорение сборки C++ проектов, способы и последстви...
 
C++ CoreHard Autumn 2018. Метаклассы: воплощаем мечты в реальность - Сергей С...
C++ CoreHard Autumn 2018. Метаклассы: воплощаем мечты в реальность - Сергей С...C++ CoreHard Autumn 2018. Метаклассы: воплощаем мечты в реальность - Сергей С...
C++ CoreHard Autumn 2018. Метаклассы: воплощаем мечты в реальность - Сергей С...
 
C++ CoreHard Autumn 2018. Кодогенерация C++ кроссплатформенно. Продолжение - ...
C++ CoreHard Autumn 2018. Кодогенерация C++ кроссплатформенно. Продолжение - ...C++ CoreHard Autumn 2018. Кодогенерация C++ кроссплатформенно. Продолжение - ...
C++ CoreHard Autumn 2018. Кодогенерация C++ кроссплатформенно. Продолжение - ...
 
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 -...
 
C++ CoreHard Autumn 2018. Обработка списков на C++ в функциональном стиле - В...
C++ CoreHard Autumn 2018. Обработка списков на C++ в функциональном стиле - В...C++ CoreHard Autumn 2018. Обработка списков на C++ в функциональном стиле - В...
C++ CoreHard Autumn 2018. Обработка списков на C++ в функциональном стиле - В...
 
C++ Corehard Autumn 2018. Обучаем на Python, применяем на C++ - Павел Филонов
C++ Corehard Autumn 2018. Обучаем на Python, применяем на C++ - Павел ФилоновC++ Corehard Autumn 2018. Обучаем на Python, применяем на C++ - Павел Филонов
C++ Corehard Autumn 2018. Обучаем на Python, применяем на C++ - Павел Филонов
 
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ć
 
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
 
C++ CoreHard Autumn 2018. Полезный constexpr - Антон Полухин
C++ CoreHard Autumn 2018. Полезный constexpr - Антон ПолухинC++ CoreHard Autumn 2018. Полезный constexpr - Антон Полухин
C++ CoreHard Autumn 2018. Полезный constexpr - Антон Полухин
 
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 Autumn 2019
Исключительная модель памяти. Алексей Ткаченко ➠ CoreHard Autumn 2019Исключительная модель памяти. Алексей Ткаченко ➠ CoreHard Autumn 2019
Исключительная модель памяти. Алексей Ткаченко ➠ CoreHard Autumn 2019
 
Как помочь и как помешать компилятору. Андрей Олейников ➠ CoreHard Autumn 2019
Как помочь и как помешать компилятору. Андрей Олейников ➠  CoreHard Autumn 2019Как помочь и как помешать компилятору. Андрей Олейников ➠  CoreHard Autumn 2019
Как помочь и как помешать компилятору. Андрей Олейников ➠ CoreHard Autumn 2019
 
Автоматизируй это. Кирилл Тихонов ➠ CoreHard Autumn 2019
Автоматизируй это. Кирилл Тихонов ➠  CoreHard Autumn 2019Автоматизируй это. Кирилл Тихонов ➠  CoreHard Autumn 2019
Автоматизируй это. Кирилл Тихонов ➠ CoreHard Autumn 2019
 
Статичный SQL в С++14. Евгений Захаров ➠ CoreHard Autumn 2019
Статичный SQL в С++14. Евгений Захаров ➠  CoreHard Autumn 2019Статичный SQL в С++14. Евгений Захаров ➠  CoreHard Autumn 2019
Статичный SQL в С++14. Евгений Захаров ➠ CoreHard Autumn 2019
 

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

  • 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
  • 21.
  • 22. Heaptrack ● https://github.com/KDE/heaptrack ● Linux-only ● GUI + консольный интерфейс ● Профилирует и визуализирует: ○ Динамику потребления памяти во времени ○ Пиковые потребления ○ Количество “утёкшей” памяти ○ Распределение потребления памяти по функциям ○ Flame Graph потребления памяти
  • 23.
  • 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
  • 28.
  • 29. CodeXL ● От AMD ● Работает с CPU от AMD ● https://github.com/GPUOpen-Tools/CodeXL ● GNU/Linux, Windows ● Бывают баги
  • 30.
  • 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