我正在研究使用log4net和System.Diagnostics.Trace
进行日志记录之间的差异,并且对我观察到的性能差异很感兴趣。
我创建了一个测试应用程序,以比较两种记录方法在几个场景下的性能,并发现log4net比Trace
类慢得多。例如,在没有字符串格式化的情况下记录1,000条消息时,log4net在1,000次试验中的平均执行时间为9.00毫秒。 Trace
的平均执行时间为1.13毫秒。我的许多测试用例中,log4net执行时间的方差相对较大;离群值的周期性长时间执行似乎暗示GC干扰。通过CLR Profiler调查发现有大量生成的log4net.Core.LoggingEvent
对象的集合(公平地说,Trace
也会生成大量的Char[]
对象,但它不显示log4net那么大的方差)。
我要记住的一件事是,即使log4net大约比Trace
慢9倍,但是在1,000次迭代中的差异是8毫秒;这并不是显著的性能问题。尽管如此,我的一些预期使用情况可能会调用数十万次记录方法,而这些数字是从我的快速机器上获得的。在更符合我们用户配置的较慢的机器上,差异为170毫秒到11毫秒,这有点令人担忧。
log4net的性能是否典型,或者是否存在一些易错点可以显著提高log4net的性能?
(注意:我知道字符串格式化会改变执行时间;我试图进行苹果与苹果的比较,并且我有没有格式化的测试用例和有格式化的测试用例;无论使用与否,log4net都保持着成比例的缓慢。)
目前情况如下:
- Robert Gould给出了最好的答案,我只是好奇是否log4net的性能比
Trace
类慢很多是常见的情况。 - Alex Shnayder的回答提供了有趣的信息,但不属于问题的范畴。引入此日志记录的目的之一是为了帮助调试生产系统中的逻辑和性能问题;我们的客户将我们的产品放在许多奇特的场景中,这些场景通常很难在没有昂贵的大规模硬件配置的情况下复制。我的主要关注点是“不记录日志”和“记录日志”之间的时间差异可能会影响系统,导致错误不会发生。最终,性能降低的尺度很大,但幅度很小,所以我希望这不会成为问题。