假设我有以下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。
发布于 2015-04-04 13:35:40
不要花太多时间来优化字节码。字节码不一定反映JIT编译方法的性能。为什么不自己拿JMH来检查这两种情况的实际性能呢?
事实上,HotSpot C2编译器以类似的方式对待tableswitch和lookupswitch,并且它很好地处理了带有间隔的顺序标签的lookupswitch。
这两种情况都以二进制搜索的方式转换成一系列比较和条件跳转指令,在性能上几乎是相同的。
https://stackoverflow.com/questions/29446748
复制相似问题