Профилирование с perf, vtune и санитайзерами
Профилируйте программы с помощью perf и Intel VTune и находите ошибки с помощью AddressSanitizer.
«Профилирование с perf, vtune и санитайзерами» — бесплатный урок C++ Academy на CoddyKit. Это урок 3 из 4. Ты можешь прочитать весь урок бесплатно ниже — а потом практиковать его прямо в браузере с встроенным редактором кода и ИИ-репетитором 24/7. Это часть пути обучения C++ Academy, и твой прогресс синхронизируется между веб-версией и приложением CoddyKit. Курс C++ Academy содержит 4 уроков всего.
Зачем профилировать
Интуиция относительно производительности обычно ошибается. Выполните профилирование, чтобы найти настоящие узкие места, а затем оптимизируйте.
Linux: perf
perf — профилировщик сэмплирования с малыми накладными расходами, поставляемый вместе с Linux. Запускайте его для любого двоичного файла, собранного с отладочной информацией.
g++ -O2 -g main.cpp -o main
perf record ./main
perf reportperf stat
Выводит сводные показатели — такты, инструкции, промахи кэша и ошибки предсказания ветвлений — для одного запуска.
perf stat -e cycles,instructions,cache-misses,branch-misses ./mainПламенные графики
Преобразуйте данные perf в пламенный график, показывающий, на что тратится время.
perf record -F 99 -g ./main
perf script | stackcollapse-perf.pl | flamegraph.pl > flame.svgmacOS: Instruments
Instruments от Apple предоставляет профилирование времени, анализ выделений памяти, утечек и многое другое. Бесплатно поставляется с Xcode.
Windows: профилировщик VTune
Intel VTune (бесплатен для личного использования) предлагает подробный анализ микроархитектуры — остановки конвейера, промахи кэша и часто выполняемые блоки. Работает на разных платформах.
Санитайзеры обнаруживают ошибки
Санитайзеры — средства проверки во время выполнения, встроенные в clang и gcc. Перекомпилируйте программу с подходящим параметром:
-fsanitize=address— AddressSanitizer для ошибок работы с памятью-fsanitize=thread— ThreadSanitizer для обнаружения состояний гонки-fsanitize=undefined— санитайзер UB для знакового переполнения и других ошибок-fsanitize=memory— MSan для обнаружения чтения неинициализированных данных
Пример AddressSanitizer
Обнаруживает переполнения буфера, использование после освобождения и повторное освобождение, выводя трассировки стека.
g++ -fsanitize=address -g main.cpp
./a.out
# Output points exactly at the bugВо время компиляции и во время выполнения
Статический анализ (clang-tidy, cppcheck) находит ошибки без запуска программы. Санитайзеры находят ошибки во время выполнения. Используйте оба подхода — они обнаруживают разные проблемы.
Профилирование выделений памяти
Выделения памяти в куче выполняются медленно. Используйте perf, massif от Valgrind или Heaptrack, чтобы находить часто выполняемые места выделения и сокращать их количество.
Чтение профилей
Сосредоточьтесь на верхних функциях в профиле. Затем изучите дерево вызовов, чтобы понять контекст. Оптимизация различий в несколько процентов обычно не оправдана.
Непрерывное профилирование
В рабочей среде профилировщики на основе сэмплирования, такие как Pyroscope или Pixie, непрерывно собирают данные с малыми накладными расходами. Так можно обнаружить регрессии до того, как они навредят пользователям.
Рабочий процесс
Цикл оптимизации:
- Измерьте показатели, чтобы найти узкое место
- Сформулируйте гипотезу
- Измените что-то одно
- Измерьте снова
Без измерений вы гадаете.
Быстрая проверка
Какой параметр компилятора включает AddressSanitizer?
Итоги
Профилируйте с помощью perf (Linux), Instruments (macOS) или VTune (на разных платформах), чтобы находить узкие места. Используйте санитайзеры, чтобы на раннем этапе обнаруживать ошибки памяти и многопоточности. Измерьте, сформулируйте гипотезу, измените и измерьте снова.
Часто задаваемые вопросы
Урок «Профилирование с perf, vtune и санитайзерами» бесплатный?
Да — полный текст урока «Профилирование с perf, vtune и санитайзерами» бесплатно доступен здесь в веб-версии. Чтобы практиковать его интерактивно (встроенный редактор кода и ИИ-репетитор 24/7) и разблокировать остальной курс C++ Academy, подпишись на CoddyKit PRO. Курс C++ Academy содержит 4 уроков всего.
Чему я научусь в уроке «Профилирование с perf, vtune и санитайзерами»?
Профилируйте программы с помощью perf и Intel VTune и находите ошибки с помощью AddressSanitizer. Ты практикуешь C++ Academy с помощью реального кода, который запускаешь прямо в браузере, и ИИ-репетитор 24/7 отвечает на твои вопросы во время урока.
Нужен ли мне опыт, чтобы начать C++ Academy?
Предыдущий опыт не требуется. C++ Academy на CoddyKit структурирован для всех уровней — от новичков до продвинутых, поэтому ты можешь начать отсюда или с самого начала и учиться в своем темпе. Это урок 3 из 4.
Сколько времени занимает урок «Профилирование с perf, vtune и санитайзерами»?
Большинство уроков CoddyKit занимают около 5–10 минут. Каждый из них компактный и интерактивный, поэтому ты постоянно делаешь прогресс и продолжаешь с того же места в веб-версии и приложении.
Можно ли писать и запускать код в этом уроке C++ Academy?
Да. Каждый урок C++ Academy включает встроенный редактор кода, поэтому ты пишешь и запускаешь реальный код прямо в браузере и получаешь моментальную обратную связь от AI — локальная установка не требуется.
Все уроки этого курса
- Структуры данных, эффективные для кэша
- Предсказание ветвлений и горячие циклы
- Профилирование с perf, vtune и санитайзерами
- Микротестирование с Google Benchmark