以c ++登录(性能注意事项)

时间:2012-07-26 19:07:00

标签: c++ performance debugging logging

我是cpp的新手(来自Java)。 我正在写一个cpp应用程序。该应用程序性能至关重要。 我找了一个日志框架,我发现log4cxx 在上面链接的末尾有性能部分解释:

  

当完全关闭日志记录或仅关闭一组级别时,   日志请求的开销包括方法调用和整数   比较

我记得在大学的旧时代,我们用#ifndf来包装日志。

问题:

  1. 使用#ifndf进行换行记录仍然是标准做法吗?

  2. 是否有类似于以下伪代码的内容?

  3. logger.Log_Debug(() => { "My complicated log message " + thisFunctionTakesALongTime() + " will take no time" });
    

4 个答案:

答案 0 :(得分:4)

您可以创建自己的宏,在发布模式下不执行任何操作:

#ifdef _DEBUG
#define LOG_DEBUG(x) logger.Log_Debug(x)
#else
#define LOG_DEBUG(x)
#endif

答案 1 :(得分:3)

创建一个有条件地编译注销的宏并不等同于在运行时将其关闭和打开。当然,如果您使用条件编译关闭日志记录,您将保存方法调用,但您将无法随意重新开启日志记录。

允许您节省方法调用的一种解决方案是使用if语句将日志记录包装在一个宏中,该语句检查是否启用了日志记录,如果未启用,则跳过调用。这将节省您的调用成本,在大多数情况下,这将比简单的条件检查更昂贵:

#define LOG(X) if(logger.is_enabled) do {logger.log(X);}while(0)

如果logger.log有多个重载,您可能需要为每组参数定义一个单独的宏。

答案 2 :(得分:1)

我可以建议你boost::logginghttp://boost-log.sourceforge.net/libs/log/doc/html/index.html但现在它不是助推器的一部分 如果您不需要登录发行版,则#ifdef是常见做法。

答案 3 :(得分:0)

https://logging.apache.org/log4cxx/latest_stable/usage.html

关闭日志记录后的日志记录性能。

当完全关闭日志记录或仅关闭一组级别的日志记录时,日志请求的成本包括方法调用和整数比较。如果未启用请求,则LOG4CXX_DEBUG和类似的宏会抑制不必要的表达式求值。