在多次使用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++ MACROs的陷阱不是很熟悉,所以如果可以用其他方法开发,请说出来。
谢谢你。