Какой будет быстрее и почему?Оптимизация метода
public void increment{
synchronized(this){
i++;
}
}
или
public synchronized void increment(){
I++;
}
метод встраивание позволит улучшить второй вариант?
Какой будет быстрее и почему?Оптимизация метода
public void increment{
synchronized(this){
i++;
}
}
или
public synchronized void increment(){
I++;
}
метод встраивание позволит улучшить второй вариант?
Разница вряд ли будет иметь значение или быть видимой, но второй пример может быть быстрее. Зачем? В Oracle/OpenJDK, менее байт-код, используемый методом, тем больше он может быть оптимизирован, например. встраиваемый.
Существует ряд пороговых значений для того, когда метод может быть оптимизирован, и эти пороговые значения основаны на числе байтов байтового кода. Во втором примере используется меньше байтового кода, поэтому можно оптимизировать его.
Одной из этих оптимизаций является анализ эвакуации, который может исключить использование для локального объекта потока. Это сделает его намного быстрее. Порог для анализа эвакуации - это метод, который по умолчанию составляет до 150 байтов (после инкрустации). Вы могли видеть случаи, когда первое решение делает метод чуть более 150 байт, а второй - чуть менее 150 байт.
Примечание:
assert
, а не потому, что они не оптимизированы, а потому, что они все еще учитывают размер байтового кода и косвенно замедляют их использование по смыслу в в некоторых случаях код не является оптимальным. (это требование должно иметь ссылку, но я не смог найти его)Является ли встраивание действительно выполненным на уровне байт-кода? Я бы подумал, что это материализовалось только на уровне сборки. –
@MarkoTopolnik он строит байтовый код, прежде чем превращать его в код машины. Байт-код одинаков на всех платформах и хорошо понимается разработчиками JVM. Машинный код отличается между моделями ЦП и изменениями с течением времени, что намного сложнее для оптимизатора программного обеспечения для работы с/преобразованием. –
Все, что я могу найти, это 'MaxInlineSize', который работает против одного метода и MaxInlineLevel, который перекрывает глубину вызовов методов. –
Оба являются одним и тем же, если это только ваш код. – SMA
Вы взглянули на байт-код? – Turing85
Да, я думаю, что на этот вопрос можно ответить, показывая байт-код. Я думаю, это будет так же, делая ответ очевидным, но без проверки я не могу быть уверен. Кроме того, я не уверен, что JLS задает определенный конкретный байт-код, так как хороший ответ будет проверяться как с OpenJDK, так и с Oracle JDK. – hyde