首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >使用箭头(->)切换表达式,现在可以生成/返回该值

使用箭头(->)切换表达式,现在可以生成/返回该值
EN

Stack Overflow用户
提问于 2020-01-15 09:18:58
回答 1查看 10.5K关注 0票数 4

Java 14中扩展的开关表达式,对于程序员/审查员来说,除了视觉清晰度之外,对开关表达式的需求是不明确的。是吗

  1. 与旧的开关表达式不同的字节代码实现?
  2. 与以前的版本相比,在执行方面有任何性能改进吗?

参考资料:https://www.techgeeknext.com/java/java14-features

JDK 14版本:

代码语言:javascript
复制
 int numLetters = switch (day) {
    case MONDAY, FRIDAY, SUNDAY -> 6;
    case TUESDAY                -> 7;
    case THURSDAY, SATURDAY     -> 8;
    case WEDNESDAY              -> 9;
};

JDK 14 -byte码

代码语言:javascript
复制
   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代码

代码语言:javascript
复制
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字节码

代码语言:javascript
复制
   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指令之外,原语没有很大的区别。

EN

回答 1

Stack Overflow用户

发布于 2020-01-15 19:21:34

switch over String一样,字节码没有改变,也没有必要改变。

虽然字节码是专为编译Java源代码而设计的,但它并没有受到同样的限制。另见Java语言中不可用的字节码特性

switch表达式利用了以前不被普通Java代码使用的特性,但肯定会被用于针对JVM的其他编程语言的自动代码生成器或编译器使用,这种特性可以将值推送到开关用例的不同分支中的操作数堆栈,以便在合并点之后使用。对于好的旧switch语句,您总是必须将值存储到局部变量中,并在合并点之后加载它。

〈的另一个特性是(Ab)使用切换指令,在切换指令之前有目标位置,从而产生花哨的循环,这不是普通Java代码所利用的,而是与Java字节码一起顺利工作的。谁知道在将来的语言版本…中,某些源代码特性是否会利用这一点呢?〉

但是是否使用中间局部变量并不重要。优化器将代码转换为SSA形式之后,即使在其他代码转换和优化应用之前,局部变量和操作数堆栈之间的所有传输都会被消除。

这并不排除由于在特定实现(版本)中对开关指令进行细微更改而导致的令人惊讶的性能差异

票数 4
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/59748267

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档