PatternLayout(log4j)的C,F,L,l和M到底有多慢?

时间:2011-01-27 17:08:09

标签: java performance logging log4j design-patterns

众所周知,PatternLayout are slowCFLlM

  

警告生成调用者位置信息非常慢,应该避免,除非执行速度不是问题。

此外,this book提到某些应用程序只能通过更改日志记录格式获得10%的速度。

但问题是,这些转换字符到底有多慢?

3 个答案:

答案 0 :(得分:10)

我使用FileAppender在我的计算机上本地测量。我很好地预热了测试,测量了许多执行并平均了(相对一致的)结果。包含execs++;log.info("t");的循环确切的数字无关紧要(因为它们取决于我的计算机)但比例确实如此。我在Java 1.6.0_10(客户端VM)上使用了log4j-1.2.16.jar。

事实证明,只要模式中出现任何C, F, L, l or M,日志记录的速度就会慢5倍。

enter image description here

答案 1 :(得分:6)

这些标记为慢的主要原因是,它们所代表的信息是通过抛出异常并分析异常的堆栈跟踪来检索的。

设计PatternLayout时,堆栈跟踪生成是一个非常昂贵的过程,所以这是公平的警告。 JVM技术的进步在此方面有所改进,因此该过程不再昂贵。尽管今天有更快的方法来获取所需的信息,但据我所知,由于注意与早期版本的Java的向后兼容性,这些方法没有被使用。

换句话说,这并不像以前那么糟糕。

答案 2 :(得分:2)

假设您不仅在学术上对答案感兴趣,而且担心登录实际应用程序的成本:

我在生产应用程序中使用它们并且它们从未提出过问题,主要是因为日志记录是一个相对罕见的事件。当然,这些应用程序都是I / O绑定的(不是记录所在的磁盘/分区),并且机器有足够的CPU周期(但它们只是PIII-1133机器),但绝大多数都适用(网络)应用程序。我只是使用它们,直到分析显示您的日志记录是一个瓶颈而不用担心它。