说我有以下switch
声明:
switch (i)
{
case 0: ...; return ...;
case 1: ...; return ...;
case 2: ...; return ...;
case 400: ...; return ...;
case 401: ...; return ...;
case 402: ...; return ...;
}
由于差距太大,编译器无法在此处生成合理的TABLESWITCH
(O(1)
复杂度)指令,因此它使用LOOKUPSWITCH
(O(log n)
复杂度)。是否可以通过将switch
分成两个来提高此代码的性能:
switch (i)
{
case 0: ...; return ...;
case 1: ...; return ...;
case 2: ...; return ...;
}
switch (i)
{
case 400: ...; return ...;
case 401: ...; return ...;
case 402: ...; return ...;
}
这会导致编译器生成两个TABLESWITCH
而不是一个LOOKUPSWITCH
。
答案 0 :(得分:2)
不要花太多时间尝试优化字节码。字节码不一定反映JIT编译方法的性能。为什么不接受JMH并自己检查两种情况的实际表现?
事实上,HotSpot C2编译器以类似的方式处理tableswitch
和lookupswitch
,它会处理具有间隙的顺序标签的lookupswitch
。
这两种情况都以二进制搜索方式转换为比较和条件跳转指令序列,并且在性能方面几乎完全相同。