【发布时间】:2010-09-17 02:41:53
【问题描述】:
我正在研究使用 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[] 对象,但它没有t 显示 log4net 的大方差。)
我要记住的一件事是,尽管 log4net 似乎比 Trace 慢大约 9 倍,但在 1,000 次迭代中相差 8 毫秒;这并不是一个显着的性能消耗。尽管如此,我的一些预期用例可能会调用记录数十万次的方法,这些数字来自我的快速机器。在较慢的机器上,我们的用户配置更典型,差异是 170 毫秒到 11 毫秒,这有点令人担忧。
这种性能是 log4net 的典型表现,还是有一些陷阱可以显着提高 log4net 的性能?
(注意:我知道字符串格式化会改变执行时间;我正在尝试将苹果与苹果进行比较,并且我有没有格式化的测试用例和带格式化的测试用例;log4net 是否保持字符串成比例地慢是否使用格式。)
到目前为止的故事:
- Robert Gould 有这个问题的最佳答案;我主要是好奇 log4net 的执行速度是否比
Trace类慢得多。 - Alex Shnayder 的回答是有趣的信息,但并不真正属于问题的范围。引入此日志记录的一半目的是帮助调试实时系统上的逻辑和性能问题;我们的客户将我们的产品置于许多奇特的场景中,如果没有昂贵的大规模硬件配置,这些场景通常很难重现。我主要担心的是“不记录”和“记录”之间的巨大时间差异可能会影响系统,从而不会发生错误。最后,性能下降的幅度很大,但幅度很小,所以我希望它不会成为问题。
【问题讨论】:
-
System.Diagnostics.Trace 作为 DebugListeners 集合的一部分运行,因此将与最慢的侦听器一样快。默认侦听器写入 Debugger.Log(如果它正在记录)或系统“输出调试字符串”。注意:除非您需要将多个侦听器附加到您的跟踪输出 Trace.WriteXX 仍然太昂贵而无法在高性能日志记录情况下使用。如果必须写入调试输出,则应直接调用 kernal32.dll 上的 OutputDebugString 函数。 (至少比 Trace.WriteLine 快 50%)
-
System.Diagnosics v2 中的 TraceSource 怎么样?与 log4net 相比,它的表现如何?
标签: performance logging log4net