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

е каркасы журналирования (например, log4j) позволяют передавать лямбда-выражения вместо`String`с API регистрации. Аргумент заключается в том, что если строка особенно выразительна для конструирования, конструкцию строки можно лениво выполнить с помощью лямбда-выражения. Таким образом, строка создается, только если уровень журнала системы совпадает с уровнем журнала.

Но, учитывая, что современные компиляторы выполняют много встроенных методов автоматически, есть ли смысл использовать лямбда-выражения таким образом? Я приведу упрощенный пример ниже, чтобы продемонстрировать эту проблему.

Предположим, что наш традиционный метод регистрации выглядит так:

Давайте предположим, что`FINE` меньше чем`CRITICAL`Таким образом, хотя создается дорогая строка, это не так, поскольку сообщение не выводится.

API лямбда-логинга помогают в этой ситуации, так что строка оценивается (создается) только при необходимости:

Но вполне возможно, что компилятор может просто встроить метод журналирования, чтобы суммарный эффект был следующим:

В этом случае нам не нужно оценивать строку до вызова API журналирования (потому что ее нет), и, по-видимому, мы получим производительность только за счет вставки.

Таким образом, мой вопрос в том, как лямбда-выражения помогают нам в этой ситуации, учитывая, что компилятор может, возможно, встроить вызовы API журналирования? Единственное, о чем я могу думать, это то, что в случае лямбды строка не оценивается, если уровень ведения журнала не совпадает.

ок. Это вообще не верно.

В частности, было бы недопустимо изменять, будут ли вызываться методы, если только JIT не можетдоказывать что эти методы не имеют другого эффекта. Я был бы очень удивлен, если бы JIT-компилятор был встроени изменить порядок в этом смысле - затраты на проверку того, что все операции, связанные с построением аргумента метода, не имеют побочных эффектов, в большинстве случаев, вероятно, не стоят выгоды. (JIT-компилятор не может трактовать методы ведения журнала иначе, чем другие методы.)

Так что пока этовозможно для действительно умного JIT-компилятора я бы очень удивился, увидевфактически сделал это. Если вы обнаружите, что работаете с ним, и напишите тестыдоказывать что этот подход не дороже, чем использование лямбда-выражений, и продолжайте доказывать, что со временем это здорово - но, похоже, вы заинтересованы в том, чтобы предположить, что это так, чего я определенно не стал бы.



 как компилятор, о котором вы говорите, изменит логику программы, и компилятор должен быть достаточно умным, чтобы понять это:

1) Без встраивания`process()` будет вызываться независимо от уровня ведения журнала:

2) с наклоном`process()` будет вызываться только при определенном уровне ведения журнала, и наша важная бизнес-логика не сможет работать:

Компилятор в этом случае должен выяснить, как создается строка сообщения, а не встроенный метод, если он вызывает любой другой метод во время своего создания.



ростых примеров, которые вы предоставили (когда это просто`String` конкатенация).

Фактически, этот API может использоваться более изощренным способом:

Допустим, у меня есть специальный поставщик, который выполняет довольно дорогое создание журнала сообщений:

и тогда я использую его в нескольких местах:

Тогда что бы вы включили? Развернуть-вставить его в

не имеет никакого смысла.

Как сказано в`java.util.logging.Logger` класс[JavaDoc](https://docs.oracle.com/javase/8/docs/api/java/util/logging/Logger.html#log-java.util.logging.Level-java.util.function.Supplier-):

Записать сообщение, которое должно быть построено только в том случае, если уровень ведения журнала таков, что сообщение действительно будет зарегистрировано.

Так что это цель: если вы можете избежать конструирования, вам не нужно выполнять эти вычисления и передавать результат в качестве параметра.