如果log4net配置中的日志级别设置为Info级别,您是否期望从A)或B)获得更好的性能? _log.Debug会自己执行更多代码并花费更长时间吗?
A)
if(_log.IsDebugEnabled)
_log.Debug("some message");
B)
_log.Debug("some message");
答案 0 :(得分:8)
在这种情况下,我会使用B。
但是,如果构造日志消息(log.Debug
的参数)可能需要一段时间 - 例如涉及重要的字符串连接 - 那么我会选择A.它将最终执行相同的测试两次“是的,记录它”的情况,但它不需要在“不,不记录它”的情况下构造日志消息。
答案 1 :(得分:4)
我会选择选项B,除非日志消息本身需要很长时间才能构建。通常情况下的性能增益可以忽略不计或甚至不存在。在内部,log4net会进行相同的检查,因此您不会自行更改任何内容。
但正如我所说,在这种情况下,选项A可能是一个好主意:
if (_log.IsDebugEnabled())
{
var message = createComplicatedLogMessageThatTakesALotOfTime();
_log.Debug(message);
}
对于所有其他情况,它只会为您记录的每条消息再添加三行,这是不值得的。
答案 2 :(得分:2)
之前的分析显示,Log4Net的IsXXXEnabled
实现并不是最快的,因为它调用了其他几种方法。 NLog的版本执行易失性读取,因此速度更快,但实际上,如果您的瓶颈在于IsXXXEnabled
,那么您已经在做低延迟的事情,并且可能会最终烹饪您自己的专用日志。
答案 3 :(得分:1)
即使第一个选项稍微高效,我也不会那么担心。
但是,如果你这样做:
_log.Debug(String.Format("{0} {1} {2}...", param1, param2, param3));
然后有一个很强的理由在之前检查_log.IsDebugEnabled。
答案 4 :(得分:0)
选项A更好,因为:
您可能不知道Debug()方法背后的内容。在传递给log4net的Debug()调用之前,是否有人添加了处理额外逻辑的本地包装器? log4net在该方法中做什么?您可能正在使用log4net的源来构建程序集,是否有另一个团队成员更改了它?好的,所以你亲自审核了代码,它非常快,而且你正在使用Nuget的程序集,所以你知道你的团队中没有人改变它。当新版本的log4net下降时,明天呢?你怎么知道有人在处理log4net bug时没有引入一些日志代码,这些代码会在所有紧密循环中融化你的服务器?下一个实习生是否复制了您的代码,并对其进行了如您所知的更改并考虑如何制作详细的复杂日志调用可能比预期更昂贵?另外,请记住,不同的appender可能会有不同的日志成本。如果某人为较慢的同步更改了轻量级快速异步appender,会发生什么?
底线:防守代码。这是一个非常简单和便宜的bool检查,它可以防止在规模和负载下出现一些意外和棘手的性能问题。你有没有看过这张支票并说,“我真的后悔写了这个'?不可能的。