1

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

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

我记得在大学的时候,我们用它#ifndf来包装日志记录。

问题:

  1. 包装日志#ifndf仍然是标准做法吗?

  2. 有没有类似下面的伪代码?

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

4 回答 4

4

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

#ifdef _DEBUG
#define LOG_DEBUG(x) logger.Log_Debug(x)
#else
#define LOG_DEBUG(x)
#endif
于 2012-07-26T19:09:34.123 回答
3

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

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

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

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

于 2012-07-26T19:18:02.807 回答
1

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

于 2012-07-26T19:14:58.990 回答
0

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

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

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

于 2019-08-26T18:36:52.323 回答