【发布时间】:2011-04-14 13:46:08
【问题描述】:
在多次使用 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++ 宏的陷阱,所以如果可以使用其他方法开发,请说出来。
谢谢。
【问题讨论】:
-
换句话说:您正在重新发明轮子。您收集的数据将不会包含来自 callgrind 的更多信息(如果不是更少)
-
是的,他的问题不是信息量,而是开销。
标签: c++ logging gprof callgrind