2012-01-05 68 views
3

尽管switch语句可以表示为一系列if语句,但是看起来,当将Java switch语句编译为字节码时,会使用不同的方法。字节码中的Switch语句的表示和效率?

  • 字节码使用的表示是什么?
  • 我认为这种替代表示法是出于效率的原因,那么效率与if语句表示的效率相比如何?
  • 是否有任何其他因素导致使用此表示形式?
+2

此[链接](http://www.artima.com/underthehood/flowP。 HTML)涵盖了它。 – CoolBeans 2012-01-05 20:03:27

回答

4

阅读spec。在Java中,如果您编写switch语句,则根据各种事情将交换机转换为字节码中的tableswitch指令。本质上是一个跳转表。但是,如果JIT可以将其优化为更高效的东西,那么字节码看起来可能是不重要的。这当然是依赖于平台的。

+0

我试图理解的部分原因是什么使这个tableswith(跳转表)比字节码if-statement更有效率,并且也跳转到特定点。 – jbranchaud 2012-02-11 17:44:16

+0

然后,你不问一个Java特定的性能问题 - 这是你可以很容易谷歌'跳转表vs如果'的东西。这里有一些东西让你开始:http://www.dotnetperls.com/if-switch-performance – 2012-02-11 20:40:45

+0

这是一个有趣的链接,但我特别感兴趣的JVM。 – jbranchaud 2012-02-11 20:46:47

0

考虑这个简单的JavaScript例子

var SwitchCases = [ 
// case 1 
function() { return "one"; }, 
// case 2 
function() { return "two"; }, 
// case 3 
function() { return "three"; }, 
// default 
function() { return ""; } 
]; 
var SwitchCaseMin = 1; 
var SwitchCaseMax = 3; 
var SwitchCaseDefault = true; 

function FakeSwitchCase(switch) { 
if(switch > SwitchCaseMax || switch < SwitchCaseMin) { 
    if(SwitchCaseDefault == true) { 
    return SwitchCases[SwitchCases.length-1](); 
    } 
} else { 
    return SwitchCases[switch - SwitchCaseMin](); 
} 
} 

的关键部分是

SwitchCases[switch - SwitchCaseMin](); 

试想一下,如果有很多情况下,评估他们将不再增大的代码,但是如果我们使用IF ..如果...否则执行时间会随着每个增加的案例而增加。

在一个真正的开关案例实现SwitchCases(从上面的代码)将是一个标签的数组/查找表(读取:偏移量)到函数中出现的代码块的位置。

EDIT

在java中上述开关壳体会被编译到后面的字节代码

[tableswitch 0xAA] 
[padding bytes 0x00 or 0x0000 or 0x000000] 
[offset of SwitchCases[3]] // default case 
[SwitchCaseMin] // 1 
[SwitchCaseMax] // 3 
[offset of SwitchCases[0]] // case 1 
[offset of SwitchCases[1]] // case 2 
[offset of SwitchCases[2]] // case 3 
+0

我的问题是关于'Java'和相应的'字节码',所以我不认为'Javascript'的例子是合适的。 – jbranchaud 2012-01-05 21:15:24

+0

@Treebranch - 我有点含糊不清,但上面的代码与Java字节码的工作原理是一致的,我将进行更新以详细说明。 – 2012-01-06 12:09:22