我正在调查使用log4net和System.Diagnostics.Trace
日志记录之间的差异,我很好奇我观察到的性能差异.
我创建了一个测试应用程序来比较几种情况下两种日志记录方法的性能,我发现log4net明显慢于Trace
类.例如,在我记录1,000条没有字符串格式的消息的情况下,log4net超过1,000次试验的平均执行时间是9.00ms. Trace
以1.13ms的平均值执行.我的很多测试用例在log4net执行时间上有很大的差异; 异常长期执行的周期性似乎表明GC干扰.使用CLR Profiler进行探测确认了生成大量log4net.Core.LoggingEvent
对象的大量集合(公平地说,它看起来也会Trace
生成大量Char[]
对象,但它不会显示log4net所做的大差异. )
我在这里要记住的一件事是,尽管log4net似乎慢了大约9倍Trace
,但差异是1,000次迭代的8ms; 这并不是一个显着的性能消耗.尽管如此,我的一些预期用例可能是调用数十万次记录事物的方法,这些数字来自我的快速机器.在较慢的机器上,更典型的用户配置,差异是170毫秒到11毫秒,这是一个更微小的警报.
这种性能是典型的log4net,还是有一些可以显着提高log4net性能的问题?
(注意:我知道字符串格式化可以改变执行时间;我试图比较苹果和苹果,我有没有格式化的测试用例和带格式化的测试用例;无论是否使用字符串格式,log4net都保持比例缓慢.)
到目前为止的故事:
罗伯特古尔德对这个问题有最好的答案; 如果通常看到log4net执行速度比Trace
类慢得多,我很好奇.
Alex Shnayder的回答是有趣的信息,但并不属于问题的范围.引入此日志记录的一半意图是协助调试实时系统上的逻辑和性能问题; 我们的客户将我们的产品置于许多奇特的场景中,如果没有昂贵的大规模硬件配置,这些场景通常难以重现.我主要担心的是"不记录"和"记录"之间的大的时间差异可能会以不会发生错误的方式影响系统.最后,性能下降的规模很大,但幅度很小,所以我希望它不会成为问题.
Robert Gould.. 12
是的log4xxx比跟踪要慢,因为trace通常是一个近乎核心的工具,而log4xxx是一个更强大的工具.我个人更喜欢log4xxx因为它的灵活性,但如果你想要的东西不会影响那么多,并且你真的不需要生产日志,比如在调试中只有跟踪就足够了.
注意:我使用log4xxx,因为完全相同的情况适用于所有带有log4库的语言,而不仅仅是.Net
是的log4xxx比跟踪要慢,因为trace通常是一个近乎核心的工具,而log4xxx是一个更强大的工具.我个人更喜欢log4xxx因为它的灵活性,但如果你想要的东西不会影响那么多,并且你真的不需要生产日志,比如在调试中只有跟踪就足够了.
注意:我使用log4xxx,因为完全相同的情况适用于所有带有log4库的语言,而不仅仅是.Net
您可能对Common.Logging库感兴趣.它是现有日志记录实现的精简抽象包装器,允许您在运行时插入您喜欢的任何日志记录框架.它也比我在博客文章中描述的关于性能的 System.Diagnostics.Trace快得多.
呃,埃里希