Если вы можете обойтись простыми метриками, в прошлом я реализовывал простой профилировщик. Отслеживайте память и время. Отслеживайте запуск и остановку каждой функции, печатайте строку в начале и конце. Отслеживайте память до и после, если это важно. Имейте все это под контролем переменной времени выполнения, которую вы можете изменить извне. В веб-приложении это может быть дополнительный параметр post / get. В толстой клиентской программе это может быть дополнительный переключатель.
Затем во время выполнения вы можете начать сбор данных. В прошлом я также добавил несколько уровней, чтобы обеспечить выборочный, а затем более подробный сбор данных.
Удачи.