Scala - TypeTags,ClassTags和WeakTypeTags的运行时性能

muc*_*aho 7 reflection scala scala-reflect

简介:

... TypeTag[T]封装某些编译时类型的运行时类型表示T....
... TypeTags的总是由编译器生成....... [1]

TypeTags位于scala.reflect.**包装中.另一个SO回答提到使用java反射会在应用程序中产生运行时性能开销.

问题:s,s和s在运行时使用java反射的
程度如何?它们是在编译时生成的,但它们在使用时是否会导致运行时性能开销?TypeTagClassTagWeakTypeTag

示例:

def isOfType[A : ClassTag : TypeTag, E : ClassTag : TypeTag](actual: A, expected: E): Boolean = {
  actual match {
    case _ : E if typeOf[A] =:= typeOf[E] => true
    case _ => false
  }
}

assert( isOfType(List.empty[Int], List.empty[Int]))
assert(!isOfType(List.empty[String], List.empty[Int]))
Run Code Online (Sandbox Code Playgroud)

虽然标签是在编译时生成的,但我可以在运行时感受到延迟.类型比较是否使用了引擎盖下不那么高效的java反射?

Ale*_*nov 3

嗯,你可以看这里。在您的情况下,不涉及 Java 反射,但=:=最终委托给isSameType2,这非常重要。它首先检查引用相等性。

  • 这取决于(令人震惊,我知道)。它绝对不总是可以忽略不计的,因为它是我们自己项目的瓶颈之一。在“case _: E”中,涉及到 Java 反射,但是您不应该陷入这样的陷阱:认为所有反射都很慢,而所有没有反射的代码都很快;特别是 `isInstanceOf` 非常快,请参见 http://stackoverflow.com/a/397617/9204 (2认同)