TABLESWITCH性能提升?

时间:2015-04-04 13:04:37

标签: java performance jvm switch-statement

说我有以下switch声明:

switch (i)
{
    case 0: ...; return ...;
    case 1: ...; return ...;
    case 2: ...; return ...;
    case 400: ...; return ...;
    case 401: ...; return ...;
    case 402: ...; return ...;
}

由于差距太大,编译器无法在此处生成合理的TABLESWITCHO(1)复杂度)指令,因此它使用LOOKUPSWITCHO(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

1 个答案:

答案 0 :(得分:2)

不要花太多时间尝试优化字节码。字节码不一定反映JIT编译方法的性能。为什么不接受JMH并自己检查两种情况的实际表现?

事实上,HotSpot C2编译器以类似的方式处理tableswitchlookupswitch,它会处理具有间隙的顺序标签的lookupswitch

这两种情况都以二进制搜索方式转换为比较和条件跳转指令序列,并且在性能方面几乎完全相同。