Java 14中扩展的开关表达式,对于程序员/审查员来说,除了视觉清晰度之外,对开关表达式的需求是不明确的。是吗
参考资料: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 -byte码
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: returnJDK-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指令之外,原语没有很大的区别。
发布于 2020-01-15 19:21:34
与switch over String一样,字节码没有改变,也没有必要改变。
虽然字节码是专为编译Java源代码而设计的,但它并没有受到同样的限制。另见Java语言中不可用的字节码特性…
switch表达式利用了以前不被普通Java代码使用的特性,但肯定会被用于针对JVM的其他编程语言的自动代码生成器或编译器使用,这种特性可以将值推送到开关用例的不同分支中的操作数堆栈,以便在合并点之后使用。对于好的旧switch语句,您总是必须将值存储到局部变量中,并在合并点之后加载它。
〈的另一个特性是(Ab)使用切换指令,在切换指令之前有目标位置,从而产生花哨的循环,这不是普通Java代码所利用的,而是与Java字节码一起顺利工作的。谁知道在将来的语言版本…中,某些源代码特性是否会利用这一点呢?〉
但是是否使用中间局部变量并不重要。优化器将代码转换为SSA形式之后,即使在其他代码转换和优化应用之前,局部变量和操作数堆栈之间的所有传输都会被消除。
这并不排除由于在特定实现(版本)中对开关指令进行细微更改而导致的令人惊讶的性能差异。
https://stackoverflow.com/questions/59748267
复制相似问题