问题描述:项目中需要利用测试工具追踪程序中的热点,进而找出程序中占用cpu time最多的代码段。测试结果发现log4cplus的接口调用(程序中使用log4cplus作为日志系统)消耗cpu time占用总耗时的一半,导致程序本身函数占用耗时比例不准确。解决方案,关闭log4cplus在程序中的调用。
分析:先来看LOG4CPLUS_DEBUG()在头文件中的宏定义:
#if !defined(LOG4CPLUS_DISABLE_DEBUG)
#define LOG4CPLUS_DEBUG(logger, logEvent) \
LOG4CPLUS_MACRO_BODY (logger, logEvent, DEBUG_LOG_LEVEL)
#define LOG4CPLUS_DEBUG_STR(logger, logEvent) \
LOG4CPLUS_MACRO_STR_BODY (logger, logEvent, DEBUG_LOG_LEVEL)
#if defined (LOG4CPLUS_HAVE_C99_VARIADIC_MACROS)
#define LOG4CPLUS_DEBUG_FMT(logger, logFmt, ...) \
LOG4CPLUS_MACRO_FMT_BODY (logger, DEBUG_LOG_LEVEL, logFmt, __VA_ARGS__)
#elif defined (LOG4CPLUS_HAVE_GNU_VARIADIC_MACROS)
#define LOG4CPLUS_DEBUG_FMT(logger, logFmt, logArgs...) \
LOG4CPLUS_MACRO_FMT_BODY(logger, DEBUG_LOG_LEVEL, logFmt, logArgs)
#endif
#else
#define LOG4CPLUS_DEBUG(logger, logEvent) LOG4CPLUS_DOWHILE_NOTHING()
#define LOG4CPLUS_DEBUG_STR(logger, logEvent) LOG4CPLUS_DOWHILE_NOTHING()
#if defined (LOG4CPLUS_HAVE_C99_VARIADIC_MACROS)
#define LOG4CPLUS_DEBUG_FMT(logger, logFmt, ...) LOG4CPLUS_DOWHILE_NOTHING()
#elif defined (LOG4CPLUS_HAVE_GNU_VARIADIC_MACROS)
#define LOG4CPLUS_DEBUG_FMT(logger, logFmt, logArgs...) LOG4CPLUS_DOWHILE_NOTHING()
#endif
可以发现,通过加上宏定义LOG4CPLUS_DISABLE_DEBUG即可使LOG4CPLUS_DEBUG()在编译阶段被编译成LOG4CPLUS_DOWHILE_NOTHING(),再来看LOG4CPLUS_DOWHILE_NOTHING()在头文件中的定义:
#define LOG4CPLUS_DOWHILE_NOTHING() \
LOG4CPLUS_SUPPRESS_DOWHILE_WARNING() \
do { } while (0) \
LOG4CPLUS_RESTORE_DOWHILE_WARNING()
#define LOG4CPLUS_SUPPRESS_DOWHILE_WARNING() /* empty */
#define LOG4CPLUS_RESTORE_DOWHILE_WARNING() /* empty */
LOG4CPLUS_DOWHILE_NOTHING()实际上只执行 do { } while (0),消耗的cpu time几乎可以忽略。
其他级别的API也是同样道理。
查看资料,
发现,在编译时加上这些宏即可。
解决方法:
在程序cmakelist中加上这些宏定义:
add_definitions(-DLOG4CPLUS_DISABLE_FATAL, -DLOG4CPLUS_DISABLE_WARN, -DLOG4CPLUS_DISABLE_ERROR, -DLOG4CPLUS_DISABLE_INFO, -DLOG4CPLUS_DISABLE_DEBUG, -DLOG4CPLUS_DISABLE_TRACE)
再次运行,问题解决。