Y ahora, estoy tratando de reescribir mi aplicación Java en Kotlin. Y luego, me encontré con la declaración de registro, como
log.info("do the print thing for {}", arg); Así que tengo dos formas de hacer las cosas de registro en Kotlin como log.info("do the print thing for {}", arg) y log.info("do the print thing for $arg") . El primero es el formato delegado a un marco como Slf4j o Log4j; el segundo está usando la plantilla de cadena Kotlin.
Entonces, ¿cuál es la diferencia y el rendimiento de cuál es mejor?
En general, estas dos formas producen el mismo registro, a menos que la biblioteca de registro también esté configurada para localizar el mensaje y los parámetros al formatear el mensaje, lo que la interpolación de cadenas de Kotlin no hace en absoluto.
La diferencia crucial radica en el rendimiento, cuando desactiva el registro (en ese nivel en particular). Como dice la pregunta frecuente de SLF4J :
Existe una alternativa muy conveniente basada en formatos de mensajes. Suponiendo que la entrada es un objeto, puede escribir:
Object entry = new SomeObject(); logger.debug("The entry is {}.", entry);Después de evaluar si iniciar sesión o no, y solo si la decisión es afirmativa, la implementación del registrador formateará el mensaje y reemplazará el par '{}' con el valor de cadena de entrada. En otras palabras, este formulario no incurre en el costo de la construcción de parámetros en caso de que la declaración de registro esté deshabilitada.
Las siguientes dos líneas producirán exactamente el mismo resultado. Sin embargo, el segundo formulario superará al primero por un factor de al menos 30, en caso de una declaración de registro deshabilitada.
logger.debug("The new entry is "+entry+"."); logger.debug("The new entry is {}.", entry);
Básicamente, si el registro está deshabilitado, el mensaje no se construirá si usa el registro parametrizado. Sin embargo, si utiliza la interpolación de cadenas, el mensaje siempre se construirá.
Tenga en cuenta que la interpolación de cadenas de Kotlin se compila en algo similar a lo que se compila en una serie de concatenación de cadenas ( + ) en Java (aunque esto podría cambiar en el futuro).
"foo $bar baz"se traduce en:
StringBuilder().append("foo ").append(bar).append(" baz").toString()Ver también: No se puede entender por qué usar el registro parametrizado