¿Por qué molestarse en usar expresiones lambda en las API de registro si el compilador posiblemente puede incorporar la llamada de registro?

Muchos marcos de registro (por ejemplo, log4j) le permiten pasar expresiones lambda en lugar deStrings a la API de registro. El argumento es que si la cadena es particularmente expresiva para construir, la construcción de la cadena se puede ejecutar perezosamente a través de la expresión lambda. De esa forma, la cadena solo se construye si el nivel de registro del sistema coincide con el de la llamada.

Pero, dado que los compiladores modernos hacen muchos métodos de alineación automática, ¿realmente tiene sentido usar expresiones lambda de esta manera? Proporcionaré un ejemplo simplificado a continuación para demostrar esta preocupación.

Supongamos que nuestro método de registro tradicional se ve así:

void log(int level, String message) {
    if (level >= System.logLevel)
        System.out.println(message);
}
// ....
System.logLevel = Level.CRITICAL;
log(Level.FINE, "Very expensive string to construct ..." + etc);

Supongamos queFINE es menos queCRITICAL, por lo tanto, aunque se construye una cadena costosa, no sirve porque el mensaje no se emite.

Las API de registro de Lambda ayudan a esta situación para que la cadena solo se evalúe (construya) cuando sea necesario:

void log(int level, Supplier<String> message) {
    if (level >= System.logLevel)
        System.out.println(message.apply());
}
// ....
System.logLevel = Level.CRITICAL;
log(Level.FINE, () -> "Very expensive string to construct ..." + etc);

Pero, es factible que el compilador pueda simplemente incorporar el método de registro para que el efecto neto sea el siguiente:

System.logLevel = Level.CRITICAL;
if (Level.FINE >= System.logLevel)
    System.out.println("Very expensive string to construct..." + etc);

En este caso, no tenemos que evaluar la cadena antes de la llamada a la API de registro (porque no hay ninguna), y presumiblemente, obtendríamos rendimiento solo con la línea.

En resumen, mi pregunta es, ¿cómo nos ayudan las expresiones lambda en esta situación dado que el compilador posiblemente puede incorporar llamadas de API de registro en línea? Lo único que puedo pensar es que, de alguna manera, en el caso lambda, la cadena no se evalúa si el nivel de registro no coincide.

Respuestas a la pregunta(3)

Su respuesta a la pregunta