这不会改变调用函数的方式。但是,如果您希望能够分析每个功能,可能没有多大用处。
static inline int real_function() {
// previous contents of function(), with no tic or toc
}
int function() {
tic();
int r = real_function();
toc();
return r;
}
正如其他人所说:使用分析器,从长远来看,它将为您节省大量精力。正如他们没有说的那样:如果您的平台有一个。
如果没有,那么最简单的方法可能是(作为编码规则)函数必须只有一个退出点,并且该退出点必须通过您的宏。然后,您可以在进入和退出时使用代码手动检测所有功能。具有多个返回的旧函数可以像上面那样包装。
另外,请记住,当您执行此类操作时,编译器可能会搞砸您。你可以这样写:
tic();
do_something();
int i = something_else();
toc();
return i;
如果编译器确定 something_else 没有副作用,那么即使 something_else 需要大量时间,它也可能会将代码变成这样:
tic();
do_something();
toc();
return something_else();
而且您的个人资料数据会低估您在函数中花费的时间。拥有一个真正的分析器非常好的另一个原因 - 它可以与编译器合作。