Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/google-cloud-platform/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
scala@switch注释,它对生成的字节码有什么影响吗?_Scala_Annotations_Match - Fatal编程技术网

scala@switch注释,它对生成的字节码有什么影响吗?

scala@switch注释,它对生成的字节码有什么影响吗?,scala,annotations,match,Scala,Annotations,Match,从scala文档中,我了解到@switch注释是告诉编译器验证匹配表达式是否已编译为表开关或lookupswitch,如果它编译为一系列条件表达式,则会发出错误 现在我的问题是,若编译成功,那个么和根本不使用@switch注释相比,生成的字节码会有什么不同吗 考虑以下两个示例代码版本 第1版 import scala.annotation.switch val x = 5 (x: @switch) match { case 1 => println("1")

从scala文档中,我了解到@switch注释是告诉编译器验证匹配表达式是否已编译为表开关或lookupswitch,如果它编译为一系列条件表达式,则会发出错误

现在我的问题是,若编译成功,那个么和根本不使用@switch注释相比,生成的字节码会有什么不同吗

考虑以下两个示例代码版本

第1版

  import scala.annotation.switch

  val x = 5

  (x: @switch) match {
    case 1 => println("1")
    case 2 => println("2")
    case _ => println("something else")
  }
第2版

  val x = 5

  (x) match {
    case 1 => println("1")
    case 2 => println("2")
    case _ => println("something else")
  }

这两个版本在编译时不是都会产生相同的字节码指令吗?

两个版本都会产生相同的字节码。您可以通过将一个版本粘贴到REPL中,执行
:javap-
将其分解,然后对另一个版本重复执行来测试这一点。

@switch具有更好的性能。您的模式匹配很简单,因为它使用映射表而不是决策树。由于内部结构是表格,所以它可以直接转到正确的“案例”。更多信息-

谢谢你的翼潜艇。那么,我们是说@switch不会增加任何运行时性能改进(因为它不会影响生成的字节码)?即使您省略了注释,优化也会发生,它只是提供了编译时保证优化是可能的。