Оптимизация не будет происходить с лямбда-примером. Вместо этого это будет с оригинальным примером. Вопрос связан с тем, нужны ли лямбды, как правило, с помощью метода встраивания.
е каркасы журналирования (например, log4j) позволяют передавать лямбда-выражения вместоString
с API регистрации. Аргумент заключается в том, что если строка особенно выразительна для конструирования, конструкцию строки можно лениво выполнить с помощью лямбда-выражения. Таким образом, строка создается, только если уровень журнала системы совпадает с уровнем журнала.
Но, учитывая, что современные компиляторы выполняют много встроенных методов автоматически, есть ли смысл использовать лямбда-выражения таким образом? Я приведу упрощенный пример ниже, чтобы продемонстрировать эту проблему.
Предположим, что наш традиционный метод регистрации выглядит так:
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);
Давайте предположим, чтоFINE
меньше чемCRITICAL
Таким образом, хотя создается дорогая строка, это не так, поскольку сообщение не выводится.
API лямбда-логинга помогают в этой ситуации, так что строка оценивается (создается) только при необходимости:
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);
Но вполне возможно, что компилятор может просто встроить метод журналирования, чтобы суммарный эффект был следующим:
System.logLevel = Level.CRITICAL;
if (Level.FINE >= System.logLevel)
System.out.println("Very expensive string to construct..." + etc);
В этом случае нам не нужно оценивать строку до вызова API журналирования (потому что ее нет), и, по-видимому, мы получим производительность только за счет вставки.
Таким образом, мой вопрос в том, как лямбда-выражения помогают нам в этой ситуации, учитывая, что компилятор может, возможно, встроить вызовы API журналирования? Единственное, о чем я могу думать, это то, что в случае лямбды строка не оценивается, если уровень ведения журнала не совпадает.