我正在研究使用 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 看起来比 慢大约 9 倍Trace
,但在 1,000 次迭代中差异是 8 毫秒;这并不是一个显着的性能消耗。尽管如此,我的一些预期用例可能会调用记录数十万次的方法,这些数字来自我的快速机器。在较慢的机器上,我们的用户配置更典型,差异是 170 毫秒到 11 毫秒,这有点令人担忧。
这种性能是 log4net 的典型表现,还是有一些可以显着提高 log4net 性能的陷阱?
(注意:我知道字符串格式化会改变执行时间;我正在尝试将苹果与苹果进行比较,并且我有没有格式化的测试用例和带格式化的测试用例;无论是否使用字符串格式化,log4net 的速度都会保持成比例。 )
到目前为止的故事:
- 罗伯特·古尔德(Robert Gould)对这个问题有最好的答案;我主要是好奇 log4net 的执行速度是否比
Trace
课堂慢得多。 - Alex Shnayder 的回答是有趣的信息,但并不真正属于问题的范围。引入此日志记录的一半目的是帮助调试实时系统上的逻辑和性能问题;我们的客户将我们的产品置于许多奇特的场景中,如果没有昂贵的大规模硬件配置,这些场景通常很难重现。我主要担心的是“不记录”和“记录”之间的较大时间差异可能会影响系统,从而不会发生错误。最后,性能下降的规模很大,但幅度很小,所以我希望它不会成为问题。