Por que se preocupar em usar expressões lambda nas APIs de log se o compilador puder embutir a chamada de log

Muitas estruturas de log (por exemplo, log4j) permitem transmitir expressões lambda em vez deStrings para a API de log. O argumento é que, se a string é particularmente expressiva para construir, a construção da string pode ser executada preguiçosamente através da expressão lambda. Dessa forma, a sequência só será construída se o nível de log do sistema corresponder ao da chamada.

Mas, dado que os compiladores modernos executam muitos métodos automaticamente, existe realmente um ponto para usar expressões lambda dessa maneira? Fornecerei um exemplo simplificado abaixo para demonstrar essa preocupação.

Suponha que nosso método tradicional de registro se pareça com o seguinte:

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);

Vamos supor queFINE é menos do queCRITICAL, portanto, embora uma cadeia de caracteres cara seja construída, é inútil, pois a mensagem não é emitida.

As APIs de log do Lambda ajudam essa situação para que a cadeia de caracteres seja avaliada (construída) apenas quando necessário:

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);

Mas, é possível que o compilador possa simplesmente incorporar o método de log para que o efeito líquido seja o seguinte:

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

Nesse caso, não precisamos avaliar a sequência antes da chamada da API de log (porque não há nenhuma) e, presumivelmente, obteríamos desempenho apenas com o inlining.

Em resumo, minha pergunta é: como as expressões lambda nos ajudam nessa situação, uma vez que o compilador pode possivelmente fazer chamadas de API de log embutido? A única coisa em que consigo pensar é que, de alguma forma, no caso lambda, a string não avalia se o nível de log não é compatível.

questionAnswers(3)

yourAnswerToTheQuestion