Java - JDK 14 - переключить выражение с помощью стрелки (->), и теперь может выдавать / возвращать значение

Расширенное выражение switch в Java - 14, необходимость выражения switch неясна, кроме визуальной ясности для программиста / обозревателя. Это-

  1. другая реализация байтового кода, чем более старое выражение switch?
  2. улучшение производительности по сравнению с предыдущей версией?

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

Это не исключает неожиданных различий в производительности, вызванных незначительными изменениями инструкции переключения в конкретной реализации (версии).

Другие вопросы по тегам