Много раз использовав gprof и callgrind , я пришел к (очевидному) выводу, что не могу эффективно использовать их при работе с большими (как в программе CAD, которая загружаетцелая машина) программы.Я думал, что, возможно, я мог бы использовать магию C / C ++ MACRO и каким-то образом создать простой (но приятный) механизм ведения журнала.Например, можно вызвать функцию с помощью следующего макроса:
#define CALL_FUN(fun_name, ...) \
fun_name (__VA_ARGS__);
Мы могли бы добавить некоторые функции синхронизации / синхронизации до и после вызова функции, чтобы каждая функция, вызываемая с помощью CALL_FUN, получала время, например,
#define CALL_FUN(fun_name, ...) \
time_t(&t0); \
fun_name (__VA_ARGS__); \
time_t(&t1);
Переменные t0, t1 могут быть найдены в глобальном объекте журналирования.Этот регистрирующий объект также может содержать граф вызовов для каждой функции, вызываемой через CALL_FUN .После этого этот объект может быть записан в (специально отформатированный) файл и проанализирован из какой-либо другой программы.
Итак, вот мой (первый) вопрос: Считаете ли вы этот подход подходящим?Если да, то как его можно улучшить, а если нет, то можете ли вы предложить лучший способ измерения времени и регистрации графов вызовов?
Коллега предложил другой подход к решению этой проблемы, который аннотируетсяконкретный комментарий к каждой функции (которую мы хотим зарегистрировать).Затем во время процесса make необходимо запустить специальный препроцессор, проанализировать каждый исходный файл, добавить логику регистрации для каждой функции, которую мы хотим зарегистрировать, создать новый исходный файл с вновь добавленным (синтаксическим анализом) кодом и вместо этого собрать этот код.Я предполагаю, что чтение макросов CALL_FUN ... (мое предложение) повсеместно - не лучший подход, и его подход решил бы эту проблему.Так что вы думаете об этом подходе?
PS: Я не очень хорошо разбираюсь в ловушках C / C ++ MACRO, поэтому, если это может быть разработано с использованием другого подхода, скажите, пожалуйста, так.
Спасибо.