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

che*_*vim 12 java performance logging design-patterns log4j

这是常识C,F,L,lM的PatternLayout的速度很慢:

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

此外,本书还提到某些应用程序只能通过更改日志记录格式来获得10%的速度.

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

che*_*vim 10

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

事实证明,无论何时C, F, L, l or M出现在模式中,日志记录的速度至少要慢5倍.

在此输入图像描述


Tho*_*sen 6

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

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

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