Запускать и использовать профилировщик VS можно прямо из коробки, для этого:
- Ставим брейкпоинты (точки останова) в начале и в конце области, в которой будем проверять загрузку ЦП. И запускаем приложение в режиме отладки (F5)
- Cправа (при дефолтном расположении окон) должно появиться окно "Средства диагностики".
- В окне диагностики ищем "Список средств" (или изображение шестерни, если надписи нет) и выпадающем списке ставим галку на "Использовании ЦП", заходим в параметры. В открывшемся окне заходим в "Использование ЦП" и устанавливаем количество выборок. Чем больше выборок, тем чаще VS смотрит чем занимается программа. При низком количестве выборок не все функции попадут в отчет профилировщика, при высоком - тратится больше ресурсов, но отчет будет точнее. Для себя я поставил максимально доступное мне количество - 8190.
- Теперь заходим в "Использование ЦП" в окне средств диагностики и прожимаем "Запись профиля ЦП" (серый кружок, если надписи нет. По прожатии станет красным). Снова жмем F5 и пропускаем первый брейкпоит - профилировщик призадумается и выдаст список функций.
- Остается только найти нужную функцию - в моем случае это мейн. Для демонстрации работы я написал две простеньких функции, которые принимают интовый вектор и пишут его размер. Первая функция принимает вектор по константной ссылке, вторая - копирует. Соответственно, в первом случае никаких конструкторов копирования и деструкторов не вызывается, во втором вызывается конструктор и деструктор, а в третьем (случай перемещения вектора во вторую функцию) - вызывается куда менее накладный конструктор перемещения и деструктор.
Результаты вполне ожидаемые:
CLion использует сторонний профилировщик, который для начала надо бы установить:
- Устанавливаем Perf и addr2line. Первый устанавливается для конкретной версии ядра, которую, напомню, можно узнать с помощью
uname -r
, второй - в составе одного из базовых пакетов системы. Но тыкнуть в него на всякий случай стоит:
res=$(uname -r)
sudo apt-get install linux-tools-$res
sudo apt-get install binutils
- Далее наобходимо изменить настройки ядра для правильной работы профилировщика. Для этого вбиваем команды:
sudo sh -c 'echo 1 >/proc/sys/kernel/perf_event_paranoid'
sudo sh -c 'echo 0 >/proc/sys/kernel/kptr_restrict'
Что они конкретно делают можно почитать здесь. Кстати, после перезапуска системы эти настройки сбросятся. Чтобы этого не происходило, вместо этих команд можно вбить:
sudo sh -c 'echo kernel.perf_event_paranoid=1 >> /etc/sysctl.d/99-perf.conf'
sudo sh -c 'echo kernel.kptr_restrict=0 >> /etc/sysctl.d/99-perf.conf'
sudo sh -c 'sysctl --system'
- Далее настроим сам проект. В первую очередь пропишем в cmakelists.txt флаг, которыq поможет побороть компилятор, который оптимизирует все подряд:
set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -O0")
-
Так же как и в VS можно настроить частоту выборок. Для этого идем в file/settings/build, execution, deployment/dynamic analysis tools/profiler и пишем нужную частоту выборок. Например, 4000.
-
Вправом верхнем углу ищем кнопку запуска профилировщика. После запуска программа отработает и снизу появится уведомление о готовности отчета. Интерфейс профилировщика в целом напоминает VS-ный, функционал тот же. Только тут будет удобнее использовать дерево вызовов.