TABLESWITCH 性能提升?
TABLESWITCH Performance Increase?
假设我有以下 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
。
不要花太多时间尝试优化字节码。字节码不一定反映 JIT 编译方法的性能。你为什么不拿 JMH 亲自检查一下这两种情况的实际表现呢?
事实上,HotSpot C2 编译器以类似的方式处理 tableswitch
和 lookupswitch
,它很好地处理了 lookupswitch
具有带间隙的顺序标签。
这两种情况都以类似于二进制搜索的方式转换为一系列比较和条件跳转指令,并且在性能方面几乎完全相同。
假设我有以下 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
。
不要花太多时间尝试优化字节码。字节码不一定反映 JIT 编译方法的性能。你为什么不拿 JMH 亲自检查一下这两种情况的实际表现呢?
事实上,HotSpot C2 编译器以类似的方式处理 tableswitch
和 lookupswitch
,它很好地处理了 lookupswitch
具有带间隙的顺序标签。
这两种情况都以类似于二进制搜索的方式转换为一系列比较和条件跳转指令,并且在性能方面几乎完全相同。