代码之家  ›  专栏  ›  技术社区  ›  OwenP

log4net比system.diagnostics.trace慢得多吗?

  •  18
  • OwenP  · 技术社区  · 17 年前

    我正在调查使用log4net和 System.Diagnostics.Trace 对于日志记录,我很好奇我观察到的性能差异。

    我创建了一个测试应用程序来比较两种日志方法在几个场景中的性能,我发现log4net比 Trace 类。例如,在我记录1000条没有字符串格式的消息的场景中,log4net在1000次测试中的平均执行时间是9.00毫秒。 痕迹 平均执行时间为1.13ms。我的许多测试用例在log4net执行时间上存在较大的差异;异常长执行的周期性似乎表明GC干扰。通过使用clr profiler进行搜索,可以确认有大量的集合用于 log4net.Core.LoggingEvent 生成的对象(公平地说,它看起来像 痕迹 产生一吨 Char[] 对象,但它不显示log4net所做的大差异。)

    我在这里记住的一件事是,尽管log4net的速度大约是log4net的9倍 痕迹 ,在1000次迭代中的差异是8ms;这并不是显著的性能消耗。尽管如此,我的一些预期用例可能正在调用记录成百上千次的方法,这些数字来自于我的快速机器。在速度较慢的机器上,用户配置的典型差异是170ms到11ms,这是一个稍微更令人担忧的差异。

    这是log4net的典型性能,还是有一些gotchas可以显著提高log4net的性能?

    ( 注意:我知道字符串格式化可以改变执行时间;我试图将apple与apple进行比较,我有没有格式化的测试用例和有格式化的测试用例;无论是否使用字符串格式化,log4net都保持成比例的慢。 )

    到目前为止的故事:

    • 罗伯特·古尔德对这个问题有着最好的答案;我主要是想知道log4net的表现是否比 痕迹 班级。
    • 亚历克斯·什纳耶的回答是有趣的信息,但并不属于问题的范围。引入此日志记录的一半目的是帮助调试实时系统上的逻辑和性能问题;我们的客户将我们的产品置于许多异国情调的场景中,如果没有昂贵和大规模的硬件配置,这些场景通常很难重现。我主要担心的是,“不记录”和“记录”之间的时间差异很大,可能会以不会发生错误的方式影响系统。最后,性能下降的幅度很大,但幅度很小,所以我希望不会有问题。
    5 回复  |  直到 13 年前
        1
  •  12
  •   Robert Gould    17 年前

    是的,log4xx比trace慢,因为trace通常是一个接近内核的工具,而log4xx是一个更强大的工具。我个人更喜欢log4xx,因为它的易热性,但是如果您想要的东西影响不大,而且您实际上不需要日志来进行生产,那么说在调试中只跟踪就足够了。

    注意:我使用log4xx是因为它适用于所有使用log4库的语言,而不仅仅是.NET。

        2
  •  6
  •   Erich Eichinger    17 年前

    您可能对 Common.Logging library .它是现有日志实现的一个瘦抽象包装器,允许您在运行时插入任何您喜欢的日志框架。而且它比System.Diagnostics.Trace快得多,如我的 blog post about performance .

    HTH 埃里希

        3
  •  4
  •   Alex Shnayder    17 年前

    根据我的经验,在大多数情况下,log4net性能不是问题。 真正的问题是,为什么您甚至需要在生产系统中“记录成百上千次的事情”。
    如我所见,在生产环境中,您应该只记录最少的裸数据(信息nd可能是警告级别),并且只有在需要时(在站点上调试问题),才应该在调试级别激活调试。

        4
  •  1
  •   Dillie-O    17 年前

    如果您想要两者兼得,log4net也允许您登录到aspnet跟踪程序。当我想要获取与日志中的特定事件相关联的性能统计信息时,我会启用此选项。

        5
  •  0
  •   Renjith K N    13 年前

    刚刚运行了一个测试,将对简单文件的顺序写入与对同一任务使用log4net进行比较。log4net比streamwriter慢400倍。因此 如果你在写大量的日志文件,我认为log4net是不可用的。 . 但我找到了它 对于少量日志条目非常有用 并进行调试。

    在某些情况下,可能是将日志隔离在单独的线程中的解决方案。