Итак, я выполнял некоторые тесты на разных структурах данных и заметил, что когда я объявлял свои переменные final, я получил 10-20% производительности.Итоговая производительность/оптимизация Java
Это действительно удивило меня. Я думал, что последнее ключевое слово чисто используется для ограничения изменений в переменных, и оптимизация будет определять, является ли какая-либо переменная постоянной или нет.
Вот пример:
import javafx.scene.input.KeyCode;
import java.util.*;
public class Main {
static /*final*/ int LOOPS = Integer.MAX_VALUE/100;
static /*final*/ KeyCode[] keyCodes = KeyCode.values();
public static void main(String[] args) {
long startTime;
long endTime;
testEnumSet(); //warmup
startTime = System.nanoTime();
testEnumSet();
endTime = System.nanoTime();
System.out.println(" EnumSet: " + (endTime - startTime) + "ns");
}
static /*final*/ EnumSet<KeyCode> enumSet = EnumSet.noneOf(KeyCode.class);
static void testEnumSet() {
for (int i = 0; i < LOOPS; i++) {
/*final*/ KeyCode add = getRandomKeyCode();
if(!enumSet.contains(add)) enumSet.add(add);
/*final*/ KeyCode remove = getRandomKeyCode();
if(enumSet.contains(remove)) enumSet.remove(remove);
}
}
/*final*/ static Random random = new Random();
static KeyCode getRandomKeyCode() {
return keyCodes[random.nextInt(keyCodes.length)];
}
}
С окончательным: .... EnumSet: 652 266 207ns
Без финале: EnumSet: 802 121 596ns
Это последовательно воспроизводимые!
Почему существует такая огромная разница между кодом, который использует final, и кодом, который этого не делает? Почему он не оптимизирован? И почему в любом случае окончательно быстрее, какова разница в сгенерированном байт-коде?
[Дублированный] (http://stackoverflow.com/questions/4279420/does-use-of-final-keyword-in-java-improve-the-performance?rq=1) –
@ JarrodRoberson - лучший рейтинг ответов, который не показывает прирост производительности, но мои тесты показывают прирост производительности на 20%, поэтому я не думаю, что это дубликат. – Jhonny007
рейтинг не означает всегда означает * правильно * иногда это просто означает, что большинство людей ошибаются. Точно так же, как ваши результаты не всегда будут воспроизводимыми, а 'final' не всегда будет давать какие-либо измеримые выигрыши. –