Java - JDK 14 - Переключать выражение с помощью стрелки (->), и теперь может возвращать / возвращать значение - PullRequest
0 голосов
/ 15 января 2020

Расширенное выражение переключателя в Java - 14, необходимость выражения переключателя неясна, кроме наглядности для программиста / рецензента. Является ли это -

  1. реализацией байт-кода, отличной от более раннего выражения переключателя?
  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;
};

JDK 14-байтовый код

   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 Ответ

2 голосов
/ 15 января 2020

Как и с switch над String, байт-код не изменился, и в этом не было необходимости.

Хотя байт-код был специально разработан для использования в качестве цели для компиляции Java источника код, это не ограничено таким же образом. См. Также Функции байт-кода, недоступные на языке Java

. Выражение switch использует функцию, ранее не использовавшуюся в обычном коде Java, но несомненно используемую автоматикой * 1025. * генераторы кода или компиляторы для других языков программирования, нацеленных на JVM, возможность помещать значения sh в стек операндов в различных ветвях вариантов коммутации, которые будут использоваться после точки слияния. Для старого доброго оператора switch вам всегда приходилось сохранять значение в локальной переменной и загружать его после точки слияния.

〈Другая функция, не используемая обычным кодом Java, но работающая с Java байт-код, это (ab) использовать инструкцию переключения для создания необычных циклов, просто имея целевое местоположение (я) перед инструкцией переключения. Кто знает, будет ли когда-нибудь использоваться функция исходного кода в будущей языковой версии… version

Но будет ли использоваться промежуточная локальная переменная или нет, это не должно иметь большого значения. После того как оптимизатор преобразовал код в форму SSA , все переносы между локальными переменными и стеком операндов исключаются даже до применения других преобразований и оптимизации кода.

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

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