Вы сказали, что не хотите переносить каждый вызов, но позвольте мне показать вам, как я обрабатываю вызовы по таймеру, чтобы их можно было удалить во время компиляции, и, возможно, это можно будет обернуть в другой макрос позже:
#ifndef NOTIME
# include <ctime>
# define CLOCK_TICK(acc, ctr) ctr = std::clock()
# define CLOCK_TOCK(acc, ctr) acc += (std::clock() - ctr)
# define CLOCK_RESET(acc) acc = 0
# define CLOCK_REPORT(acc) 1000. * double(acc) / double(CLOCKS_PER_SEC)
static clock_t t1a, t1c, t2a, t2c; // as many pairs as you need
#else
# define CLOCK_TICK(acc, ctr)
# define CLOCK_TOCK(acc, ctr)
# define CLOCK_RESET(acc)
# define CLOCK_REPORT(acc) 0
#endif
Теперь вы можете использовать его следующим образом:
CLOCK_RESET(t1a);
for (int i = 0; i != 250000; ++i)
{
CLOCK_TICK(t1a, t1c);
some_expensive_function();
CLOCK_TOCK(t1a, t1c);
}
std::cout << "Time spent in some_expensive_function(): " << CLOCK_REPORT(t1a) << "ms.\n";
С помощью переменных макросов вы можете даже завершить вызов функции:
#define timed_call(ACC, CTR, func, ...) do { CLOCK_TICK(ACC, CTR); \
func(__VA_ARGS__); \
CLOCK_TOCK(ACC,CTR); \
} while (false)