当前位置: 首页 > 知识库问答 >
问题:

JVM的LookupSwitch和TableSwitch之间的区别?

杜嘉慕
2023-03-14

每个的Jasmin文档:

  • 查找开关
  • 桌面女巫
  • 两者

共有1个答案

夹谷星剑
2023-03-14

不同的是

  • LookupSwitch使用带有键和标签的表
  • TableSwitch只使用带有标签的表。

执行tableswitch时,堆栈顶部的int值直接用作表中的索引,以获取跳转目标并立即执行跳转。整个查找+跳转过程是一个O(1)操作,这意味着它非常快。

switch (inputValue) {
  case 1:  // ...
  case 2:  // ...
  case 3:  // ...
  default: // ...
}

上面的开关非常紧凑,没有数字“孔”。编译器将创建一个tableswitch,如下所示:

 tableswitch 1 3
    OneLabel
    TwoLabel
    ThreeLabel
  default: DefaultLabel

Jasmin页面中的伪代码很好地解释了这一点:

int val = pop();                // pop an int from the stack
if (val < low || val > high) {  // if its less than <low> or greater than <high>,
    pc += default;              // branch to default 
} else {                        // otherwise
    pc += table[val - low];     // branch to entry in table
}

这段代码非常清楚地说明了这样一个tableswitch是如何工作的。valinputvaluelow为1(开关中的最低case值),high为3(开关中的最高case值)。

switch (inputValue) {
  case 1:  // ...
  case 3:  // ...
  case 4:  // ...
  case 5:  // ...
  default: // ...
}
 tableswitch 1 6
    OneLabel
    FakeTwoLabel
    ThreeLabel
    FourLabel
    FiveLabel
  default: DefaultLabel

  ; <...code left out...>

  FakeTwoLabel:
  DefaultLabel:
    ; default code
switch (inputValue) {
  case 1:    // ...
  case 10:   // ...
  case 100:  // ...
  case 1000: // ...
  default:   // ...
}

这个开关远远不够紧凑,它有比数值多一百倍的孔。人们会称之为稀疏开关。编译器将不得不生成近千个假案例来将这个开关表示为一个表女巫。结果将是一个巨大的表,极大地扩大了类文件的大小。这是不实际的。相反,它将生成一个lookupswitch:

lookupswitch
    1       : Label1
    10      : Label10
    100     : Label100
    1000    : Label1000
    default : DefaultLabel

这个表只有5个条目,而不是一千多个条目。该表有4个实值,O(log4)是2(log在这里是以2为基数,而不是以10为基数,因为计算机是在二进制数字上操作的)。这意味着VM最多进行两次比较,才能找到inputValue的标签,或者得出结论,即该值不在表中,因此必须执行默认值。即使表有100个条目,VM也最多需要7次比较才能找到正确的标签或决定跳转到默认标签(而7次比较要比100次比较少得多,你不觉得吗?)。

所以说这两个指令是可以互换的,或者说这两个指令的原因是有历史原因的,这都是无稽之谈。对于两种不同的情况,有两个指令,一个用于具有紧凑值的开关(用于最大速度),另一个用于具有稀疏值的开关(不是最大速度,但仍然是良好的速度和非常紧凑的表表示,不管数字孔如何)。

 类似资料:
  • 问题内容: 我很难理解Java字节码中的LookUpSwitch和TableSwitch。 如果我很好理解,LookUpSwitch和TableSwitch都对应于Java源代码的声明?为什么一个JAVA语句会生成2个不同的字节码? 每个Jasmin文档: 查找开关 tableswi instructions 问题答案: 区别在于 lookupswitch 使用 带有键和标签的表 tableswi

  • 问题内容: 什么是HotSpot?它与JVM和OpenJDK有什么关系?是图书馆吗?它到底是做什么的? 另外,OpenJDK和HotSpot有什么区别? 问题答案: Java虚拟机规范中明确说明了什么是Java虚拟机 根据定义,JVM是虚拟机,即模拟真实计算机执行功能的软件计算机。就像真实的机器一样,它具有指令集,虚拟计算机体系结构和执行模型。它能够运行用该虚拟指令集编写的代码,非常类似于真实机器

  • 有人能解释一下GraalVM和Jvm热点之间的区别,以及GraalVM与OpenJDK热点的关系吗。

  • 问题内容: 我听到有人说“ JVM一定是Java解释器,但Java解释器不一定是JVM”。真的吗? 我的意思是Java解释器和JVM之间有区别吗? 问题答案: 是,有一点不同。 Java虚拟机: 一种软件“执行引擎”,可安全,兼容地执行微处理器(无论是计算机还是其他电子设备中)的Java类文件中的字节码。 Java解释器: 交替解码并执行某些代码体中的每个语句的模块。Java解释器解码并执行Jav

  • JVM、JDK、JRE和OpenJDK之间的区别是什么? 我在Java编程时遇到了这些短语,它们之间有什么不同?