Java - JDK 14 - переключить выражение с помощью стрелки (->), и теперь может выдавать / возвращать значение
Расширенное выражение switch в Java - 14, необходимость выражения switch неясна, кроме визуальной ясности для программиста / обозревателя. Это-
- другая реализация байтового кода, чем более старое выражение switch?
- улучшение производительности по сравнению с предыдущей версией?
Ссылка: https://www.techgeeknext.com/java/java14-features
JDK - 14 версия:
int numLetters = switch (day) {
case MONDAY, FRIDAY, SUNDAY -> 6;
case TUESDAY -> 7;
case THURSDAY, SATURDAY -> 8;
case WEDNESDAY -> 9;
};
14-байтовый код JDK
0: iconst_1
1: istore_1
2: iload_1
3: tableswitch { // 1 to 7
1: 44
2: 44
3: 44
4: 49
5: 54
6: 54
7: 59
default: 64
}
44: bipush 6
46: goto 65
49: bipush 7
51: goto 65
54: bipush 8
56: goto 65
59: bipush 9
61: goto 65
64: iconst_0
65: istore_2
66: return
Код JDK - 10
int numLetters;
int day = 1;
switch (day) {
case 1:
case 2:
case 3:
numLetters = 6;
break;
case 4:
numLetters = 7;
break;
case 5:
case 6:
numLetters = 8;
break;
case 7:
numLetters = 9;
break;
default:
numLetters = 0;
}
JDK - 10-байтовый код
0: iconst_1
1: istore_2
2: iload_2
3: tableswitch { // 1 to 7
1: 44
2: 44
3: 44
4: 50
5: 56
6: 56
7: 62
default: 68
}
44: bipush 6
46: istore_1
47: goto 70
50: bipush 7
52: istore_1
53: goto 70
56: bipush 8
58: istore_1
59: goto 70
62: bipush 9
64: istore_1
65: goto 70
68: iconst_0
69: istore_1
70: return
Для примитивов нет большой разницы, кроме локальных назначений в блоках, сократились инструкции JIT.
1 ответ
Как с switch
над String
, байт-код не изменился и в этом не было необходимости.
Хотя байт-код был разработан специально для использования в качестве цели для компиляции исходного кода Java, он не ограничивается таким же образом. См. Также Функции байт-кода, недоступные в языке Java…
В switch
выражение использует функцию, ранее не использовавшуюся обычным кодом Java, но обязательно используемую автоматическими генераторами кода или компиляторами для других языков программирования, нацеленных на JVM, возможность проталкивать значения в стек операндов в различных ветвях случаев переключения, которые будут использоваться после точки слияния. Для старых добрыхswitch
оператор, вам всегда приходилось сохранять значение в локальной переменной и загружать его после точки слияния.
〈Еще одна особенность, которая не используется обычным Java-кодом, но которая плавно работает с байт-кодом Java, - это (ab) использование инструкции переключения для создания причудливых циклов, просто имея целевое местоположение (я) перед инструкцией переключения. Кто знает, сможет ли какая-нибудь функция исходного кода когда-либо использовать это в будущей языковой версии…〉
Но используется ли промежуточная локальная переменная или нет, не имеет большого значения. После того как оптимизатор преобразовал код в форму SSA, все передачи между локальными переменными и стеком операндов исключаются даже до того, как будут применены другие преобразования и оптимизации кода.
Это не исключает неожиданных различий в производительности, вызванных незначительными изменениями инструкции переключения в конкретной реализации (версии).