Оптимизация не будет происходить с лямбда-примером. Вместо этого это будет с оригинальным примером. Вопрос связан с тем, нужны ли лямбды, как правило, с помощью метода встраивания.

е каркасы журналирования (например, 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 журналирования? Единственное, о чем я могу думать, это то, что в случае лямбды строка не оценивается, если уровень ведения журнала не совпадает.

Ответы на вопрос(3)

Ваш ответ на вопрос