Kotlin 中的字符串模板和日志框架的占位符有什么区别?
What's the difference between string template and log framework's placeholder in Kotlin?
现在,我正在尝试用 Kotlin 重写我的 java 应用程序。然后,我遇到了日志语句,like
log.info("do the print thing for {}", arg);
所以我有两种方法可以在 Kotlin 中执行日志操作,例如 log.info("do the print thing for {}", arg)
和 log.info("do the print thing for $arg")
。第一种是委托格式给 Slf4j 或 Log4j 等框架;第二个是使用 Kotlin 字符串模板。
那么有什么区别,哪个性能更好呢?
一般来说,这两种方式产生的日志是一样的,除非日志库在格式化消息的时候也配置了对消息和参数进行本地化,而Kotlin的字符串插值根本做不到。
当您关闭日志记录(在特定级别)时,关键区别在于性能。正如 SLF4J's FAQ 所说:
There exists a very convenient alternative based on message formats.
Assuming entry is an object, you can write:
Object entry = new SomeObject();
logger.debug("The entry is {}.", entry);
After evaluating whether to log or not, and only if the decision is
affirmative, will the logger implementation format the message and
replace the '{}' pair with the string value of entry. In other words,
this form does not incur the cost of parameter construction in case
the log statement is disabled.
The following two lines will yield the exact same output. However, the
second form will outperform the first form by a factor of at least 30,
in case of a disabled logging statement.
logger.debug("The new entry is "+entry+".");
logger.debug("The new entry is {}.", entry);
基本上,如果禁用日志记录,如果您使用参数化日志记录,则不会构造消息。但是,如果您使用字符串插值,将始终构造消息。
请注意,Kotlin 的字符串插值编译为类似于 Java 中的一系列字符串连接 (+
) 编译为的内容(尽管这可能在未来发生变化)。
"foo $bar baz"
翻译成:
StringBuilder().append("foo ").append(bar).append(" baz").toString()
另请参阅:
现在,我正在尝试用 Kotlin 重写我的 java 应用程序。然后,我遇到了日志语句,like
log.info("do the print thing for {}", arg);
所以我有两种方法可以在 Kotlin 中执行日志操作,例如 log.info("do the print thing for {}", arg)
和 log.info("do the print thing for $arg")
。第一种是委托格式给 Slf4j 或 Log4j 等框架;第二个是使用 Kotlin 字符串模板。
那么有什么区别,哪个性能更好呢?
一般来说,这两种方式产生的日志是一样的,除非日志库在格式化消息的时候也配置了对消息和参数进行本地化,而Kotlin的字符串插值根本做不到。
当您关闭日志记录(在特定级别)时,关键区别在于性能。正如 SLF4J's FAQ 所说:
There exists a very convenient alternative based on message formats. Assuming entry is an object, you can write:
Object entry = new SomeObject(); logger.debug("The entry is {}.", entry);
After evaluating whether to log or not, and only if the decision is affirmative, will the logger implementation format the message and replace the '{}' pair with the string value of entry. In other words, this form does not incur the cost of parameter construction in case the log statement is disabled.
The following two lines will yield the exact same output. However, the second form will outperform the first form by a factor of at least 30, in case of a disabled logging statement.
logger.debug("The new entry is "+entry+"."); logger.debug("The new entry is {}.", entry);
基本上,如果禁用日志记录,如果您使用参数化日志记录,则不会构造消息。但是,如果您使用字符串插值,将始终构造消息。
请注意,Kotlin 的字符串插值编译为类似于 Java 中的一系列字符串连接 (+
) 编译为的内容(尽管这可能在未来发生变化)。
"foo $bar baz"
翻译成:
StringBuilder().append("foo ").append(bar).append(" baz").toString()
另请参阅: