She*_*Wei 4 logging stringtemplate kotlin
现在,我正在尝试用 Kotlin 重写我的 java 应用程序。然后,我遇到了日志语句,比如
log.info("do the print thing for {}", arg);
Run Code Online (Sandbox Code Playgroud)
所以我有两种方法可以在 Kotlin 中执行日志操作,例如log.info("do the print thing for {}", arg)
和log.info("do the print thing for $arg")
。第一个是 Slf4j 或 Log4j 等框架的委托格式;第二个是使用 Kotlin 字符串模板。
那么它们有什么区别,哪个性能更好呢?
一般来说,这两种方式会产生相同的日志,除非日志库也配置为在格式化消息时本地化消息和参数,而 Kotlin 的字符串插值根本不这样做。
关键的区别在于关闭日志记录(在特定级别)时的性能。正如SLF4J 的常见问题解答所述:
有一个基于消息格式的非常方便的替代方案。假设entry是一个对象,你可以这样写:
Run Code Online (Sandbox Code Playgroud)Object entry = new SomeObject(); logger.debug("The entry is {}.", entry);
在评估是否记录之后,并且只有当决定是肯定的时,记录器实现才会格式化消息并将“{}”对替换为条目的字符串值。换句话说,如果日志语句被禁用,这种形式不会产生参数构造的成本。
以下两行将产生完全相同的输出。但是,在禁用日志记录语句的情况下,第二种形式的性能将比第一种形式至少高出 30 倍。
Run Code Online (Sandbox Code Playgroud)logger.debug("The new entry is "+entry+"."); logger.debug("The new entry is {}.", entry);
基本上,如果禁用日志记录,并且使用参数化日志记录,则不会构造消息。但是,如果您使用字符串插值,则始终会构造消息。
请注意,Kotlin 的字符串插值编译结果与 Java 中的一系列字符串连接 ( +
) 编译结果类似(尽管将来可能会改变)。
"foo $bar baz"
Run Code Online (Sandbox Code Playgroud)
被翻译成:
StringBuilder().append("foo ").append(bar).append(" baz").toString()
Run Code Online (Sandbox Code Playgroud)
另请参阅:无法理解为什么使用参数化日志记录
归档时间: |
|
查看次数: |
2405 次 |
最近记录: |