Для чего-то подобного я всегда использовал способ «старой школы»:
Вставьте в процедуру, которую вы хотите измерить в различных точках, операторы, которые измеряют текущее время (или cputime). Затем просто распечатайте или запишите различия между ними, и вы узнаете, сколько времени занял каждый раздел кода. Оттуда вы можете узнать, что ест большую часть времени, и войти и получить точную хронологию в этом разделе, пока не узнаете, в чем проблема и как ее устранить.
Если издержки вызова функции не являются проблемой, вы также можете принудительно отключить встраивание с помощью -fno-inline-small-functions -fno-inline-functions -fno-inline-functions-called-once -fno-inline
(я не совсем уверен, как эти переключатели взаимодействуют друг с другом, но я думаю, что они независимы). Затем вы можете использовать свой обычный профилировщик, чтобы посмотреть профиль графика вызовов и посмотреть, какие вызовы функций занимают какое количество времени.