【问题标题】:Scala - Run-time performance of TypeTags, ClassTags and WeakTypeTagsScala - TypeTags、ClassTags 和 WeakTypeTags 的运行时性能
【发布时间】:2015-04-18 14:03:13
【问题描述】:

简介

...TypeTag[T] 封装了一些编译时类型T 的运行时类型表示。 ...
... TypeTags 始终由编译器生成。 ...[1]

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

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

示例

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]))

虽然标签是在编译时生成的,但我可以感觉到运行它时的延迟。类型比较是否在底层使用了性能不佳的 java 反射?

【问题讨论】:

    标签: scala reflection scala-reflect


    【解决方案1】:

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

    【讨论】:

    • 那么你会说在这种情况下类型比较的开销可以忽略不计,还是建议尽可能避免它? (我知道这有点主观,只有微基准测试才能给出正确的见解)。匹配表达式case _ : E 呢? AfaIk ClassTag 这里涉及比较,是不是也没有java反射就完成了?
    • 这取决于(震惊,我知道)。它绝对不是总是可以忽略的,因为它是我们自己项目的瓶颈之一。在case _: E 中涉及到Java 反射,但您不应该陷入认为所有反射都很慢而所有没有反射的代码都很快的陷阱;特别是isInstanceOf 非常快,请参见例如stackoverflow.com/a/397617/9204
    猜你喜欢
    • 1970-01-01
    • 2017-02-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多