背景:
最近项目上,关于是否使用占位符有不同的意见,尤其是以前使用字符串拼接的,觉得挺好的,没啥问题,为啥使用占位符,然后,他们在网上还找了一篇专门做性能比对的,主要针对的速度,文章里面测试了速度,速度有提高,但是说影响不大。
个人意见:
针对这种说法,以及网上一些粗制滥造的文章,我觉得有必要纠正一下
使用占位符不仅仅是速度提升的问题,主要是性能提升,节省内存,举例说明:
如果日志级别是info,那么debug级别的日志,占位符不会进行拼接,不会占据更多内存,但是字符串拼接却是直接拼接了,内存升高,如果打印的对象比较大,日志量多,内存很容被吃爆的
原理分析
在这里不做速度方面的测试,我们只看看占位符在什么时间进行拼接,下面是以logback为例的:
首先进入代码:
红线标注的是项目设置的日志级别跟你需要打印的日志级别的比较,比如:你设置的是info,打印的是debug,那么到这里直接就返回了
buildLoggingEventAndAppend方法是继续往下走
继续往下走:
OutputStreamAppender这个类的subAppend方法将要输入信息,它会将prepareForDeferredProcessing方法
继续看:
这个红线的方法是拼接占位符
一直往下走:
这个方法是进行占位符拼接的
结论:
当使用占位符的时候,如果不是打印的级别,数据不会进行拼接